pour le accept : impossible, le serveur doit etre capable de gerer des connexions simultanées...
tu te trompes. après le succès de accept(2), tu utilises la valeur de retour comme moyen de communication avec le client qui vient de se connecter, et tu peux faire un autre accept(2) pour accepter une deuxième connexion en parallèle. pour traiter correctement en parallèle cette deuxième connexion et la communication sur la première, il te suffit de mettre tous les descripteurs nécessaires dans un fd_set à passer à select(2).
voici un code minimaliste illustrant ça :
-=-=---=-=---=-=---=-=---=-=---=-=---=-=--
struct sockaddr_in client_addr;
struct timeval tv;
while (1) {
int fd;
int retval;
fd_set conns_set;
FD_ZERO(&conns_set);
/* ... ajout des descripteurs des connexions ouvertes à conns_set ... */
// ajout du descripteur correspondant à notre serveur
FD_SET(tcp_server_socket, &conns_set);
tv.tv_sec = 30;
tv.tv_usec = 0;
// attente d'une entrée/sortie sur un des descripteurs de conns_set
if ((retval = select(FD_SETSIZE, &conns_set, NULL, NULL, &tv)) == -1) {
perror("select");
exit(-1);
}
// si select est sorti sur un timeout, rien à traiter, on boucle directement
if (!retval)
continue;
/* ... traitement de l'input sur les descripteurs des connexions ouvertes s'ils sont toujours dans conns_set ... */
// traitement d'une nouvelle connexion
if (FD_ISSET(tcp_server_socket, &conns_set)) {
if ((fd = accept(tcp_server_socket, (struct sockaddr *) &client_addr, (socklen_t *) &len)) == -1) {
perror("accept");
exit(-1);
}
/* ... ajouter "fd" dans la liste des descripteurs de connexions ouvertes ... */
}
}
-=-=---=-=---=-=---=-=---=-=---=-=---=-=--
[^] # Re: unix, udp, tcp
Posté par gc . En réponse au message socket serveur / client. Évalué à 3.
tu te trompes. après le succès de accept(2), tu utilises la valeur de retour comme moyen de communication avec le client qui vient de se connecter, et tu peux faire un autre accept(2) pour accepter une deuxième connexion en parallèle. pour traiter correctement en parallèle cette deuxième connexion et la communication sur la première, il te suffit de mettre tous les descripteurs nécessaires dans un fd_set à passer à select(2).
voici un code minimaliste illustrant ça :
-=-=---=-=---=-=---=-=---=-=---=-=---=-=--
struct sockaddr_in client_addr;
struct timeval tv;
while (1) {
int fd;
int retval;
fd_set conns_set;
FD_ZERO(&conns_set);
/* ... ajout des descripteurs des connexions ouvertes à conns_set ... */
// ajout du descripteur correspondant à notre serveur
FD_SET(tcp_server_socket, &conns_set);
tv.tv_sec = 30;
tv.tv_usec = 0;
// attente d'une entrée/sortie sur un des descripteurs de conns_set
if ((retval = select(FD_SETSIZE, &conns_set, NULL, NULL, &tv)) == -1) {
perror("select");
exit(-1);
}
// si select est sorti sur un timeout, rien à traiter, on boucle directement
if (!retval)
continue;
/* ... traitement de l'input sur les descripteurs des connexions ouvertes s'ils sont toujours dans conns_set ... */
// traitement d'une nouvelle connexion
if (FD_ISSET(tcp_server_socket, &conns_set)) {
if ((fd = accept(tcp_server_socket, (struct sockaddr *) &client_addr, (socklen_t *) &len)) == -1) {
perror("accept");
exit(-1);
}
/* ... ajouter "fd" dans la liste des descripteurs de connexions ouvertes ... */
}
}
-=-=---=-=---=-=---=-=---=-=---=-=---=-=--