• [^] # Re: unix, udp, tcp

    Posté par . En réponse au message socket serveur / client. Évalué à 3.

    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 ... */
    }
    }
    -=-=---=-=---=-=---=-=---=-=---=-=---=-=--