Il existe plusieurs façons de gérer plusieurs clients...
Il y a celle qui utilise en effet fork(). Je vais essayer de te l'expliquer en étapes :
1) Le serveur écoute sur une socket d'écoute (listenfd). Il attend qu'un client se connecte.
2) Le client fait une demande de connexion sur listenfd. Le serveur crée une socket connectée (connfd) et le client s'y connecte. Ensuite, le serveur crée un processus fils qui aura les mêmes sockets que lui.
La différence vient du fait que le processus père coupe la connexion au niveau de connfd, et le processus fils coupe celle au niveau de listenfd (il n'en a pas besoin).
3) Ca recommence autant de fois qu'il le faut...
En gros, ça ressemble à ça :
1)
Client ° ° listenfd Serveur
2)
Client ° __________ ° listenfd Serveur (Demande de connexion)
3)
1 2
| ° listenfd
Client ° ---------- ° connfd Serveur (Connexion) |
4)
1 2 3 4 5
| ° listenfd
Client ° ---------- ° connfd Serveur (Création du process fils)
\
\ ° listenfd
------- ° connfd Child |
5)
1 2 3 4
| Client ° ° listenfd Serveur (Suppression des sockets inutiles)
\
\
------ ° connfd Child |
Il existe une deuxième solution qui consiste à créer un tableau de sockets,
qui sont à -1 si elles sont disponibles. Quand un client se connecte, on y met la valeur de la socket. Pour gérer le tout, on utilise généralement select().
Désolé si j'ai pas été super clair, mais bon spas facile à expliquer comme ça
Partager