# Étude Fonction rand()

Ce projet analyse le comportement de la fonction rand() en C à travers une architecture distribuée client-serveur. Il permet de générer et d'analyser une grande quantité de nombres aléatoires (jusqu'à 12000 milliards dans nos tests) en utilisant plusieurs ordinateurs en réseau.

## 🌟 Caractéristiques

### Architecture Distribuée
- Architecture client-serveur pour la distribution des calculs
- Support de multiples clients simultanés (testé avec 19 clients)
- Communication réseau via sockets TCP/IP
- Capacité de traitement massif (12000 milliards de nombres testés)

### Interface Principale
- Menu interactif pour lancer le client ou le serveur
- Validation automatique des adresses IP et ports
- Compilation automatique avec optimisation (-O3)
- Gestion robuste des erreurs de saisie
- Messages d'interface personnalisables via fichiers texte

### Performance
- Architecture multi-processus (6 processus par instance)
- Synchronisation via sémaphores
- Gestion de mémoire partagée (IPC)
- Traitement parallèle sur plusieurs machines

### Analyse & Statistiques
- Génération de fichiers CSV pour l'analyse
- Calcul des occurrences minimum et maximum
- Analyse des ratios de distribution
- Visualisation des données

## 📋 Prérequis

- Système d'exploitation Linux/Unix
- Compilateur GCC
- Réseau local pour le mode distribué

## 🛠️ Installation

1. Clonez le dépôt :
```bash
git clone https://www-apps.univ-lehavre.fr/forge/bh243413/etude_fonction_rand_c
cd Analyse-Random-C
```

2. Compilez les programmes :
```bash
gcc -o main main.c
```

## 💻 Utilisation

1. Lancez le programme principal :
```bash
./main
```

2. Suivez les instructions du menu pour :
    - Lancer un serveur en spécifiant l'adresse IP, le port et le nombre de clients
    - Ou lancer un client en spécifiant l'adresse IP et le port du serveur

### Configuration manuelle (alternative)
Si vous préférez compiler et exécuter les programmes individuellement :

1. Pour le serveur :
```bash
gcc -o server server.c 
./server [adresseIP:port] [nombreClients]
# Exemple : ./server 127.0.0.1:8080 19
```

2. Pour le client :
```bash
gcc -o client client.c 
./client [adresseIP:port]
# Exemple : ./client 127.0.0.1:8080
```

## 🔧 Configuration

### Paramètres Client
```c
#define TAILLE_TABLEAU (1<<28)  // Taille du tableau des occurrences
#define NBR_PROCESSUS 6         // Nombre de processus
#define NBR_CYCLES 10          // Nombre de cycles
#define NBR_RANDOMS (10000000000LL) // Nombres aléatoires par cycle
```

### Paramètres Serveur
```c
int nbrClientPrevus = 1;      // Nombre de clients à attendre
long long nbr_total_rand_generer = 1200000000000LL; // Nombre total de nombres à générer
```

## 📊 Structure du Projet

```
.
|__ main.c                # Programme principal (menu interactif)
├── server.c              # Code source du serveur
├── client.c              # Code source du client
├── log/                  # Dossiers des logs
│   ├── server/
│   │   └── log.txt      # Logs serveur
│   └── client/
│       └── log.txt      # Logs client
├── CSV/                  # Fichiers de données générés
│   ├── donnees_index_occurence.csv
│   └── donnees_ratio_max_min.csv
└── text/                 # Messages d'interface
    ├── main/
    │   └── text_bienvenue.txt
    ├── server/
    │   ├── text_bienvenue.txt
    │   └── text_fin.txt
    └── client/
        ├── text_bienvenue.txt
        └── text_fin.txt
```

## 🔍 Fonctionnement

### Programme Principal (main)
1. **Interface**
    - Affichage du menu de sélection
    - Validation des entrées utilisateur
    - Compilation automatique des programmes

2. **Configuration**
    - Validation des adresses IP
    - Vérification des ports (1-65535)
    - Limitation du nombre de clients (1-100)

### Serveur
1. **Initialisation**
    - Configuration du socket serveur
    - Création de la mémoire partagée et des sémaphores
    - Attente des connexions clients

2. **Traitement**
    - Réception des données des clients
    - Synchronisation des tableaux d'occurrences
    - Génération des statistiques globales

3. **Analyse**
    - Calcul des occurrences min/max
    - Génération des fichiers CSV
    - Production des ratios de distribution

### Client
1. **Génération**
    - Création des processus de génération
    - Production des nombres aléatoires
    - Synchronisation locale via sémaphores

2. **Communication**
    - Connexion au serveur
    - Envoi des données
    - Nettoyage des ressources

## 📝 Logs

Le système maintient des logs détaillés pour le serveur et le client :
- Horodatage de chaque opération
- Suivi des connexions réseau
- Statistiques de génération
- Erreurs et succès

## 📊 Fichiers CSV Générés

1. **donnees_index_occurence.csv**
    - Index des nombres générés
    - Nombre d'occurrences pour chaque valeur

2. **donnees_ratio_max_min.csv**
    - Ratio de distribution
    - Valeurs maximales et minimales
    - Statistiques globales

## 👥 Auteurs

- BA Hamadou
- BA Salimatouh Maliah

## 📅 Date de création

15 Décembre 2024

## ⚠️ Notes importantes

- Le programme principal doit être exécuté depuis la racine du projet
- Le programme a été testé avec succès sur 19 clients simultanés
- Capacité de génération de 12000 milliards de nombres aléatoires
- Utilisation optimale sur un réseau local pour les performances

## 📄 Licence

Ce projet est distribué sous licence MIT. Voir le fichier `LICENSE` pour plus de détails.