2017-02-21 1 views
0

Jusqu'à présent, tout fonctionnait parfaitement. Juste le problème que j'ai eu est que je ne peux pas penser à une façon d'attribuer ou je dirais donner des noms aux clients qui se connectent au serveur de sorte que d'autres clients qui savent est écritUnix socket Discussion de groupe de clients multiples avec le nom du client dans c

serveur :

while (1) { 
    FD_ZERO(&read_set); 
    //FD_ZERO(&write_set); 

    FD_SET(fd, &read_set); 
    //FD_SET(fd, &write_set); 

    for (i = 0; i < num_clients; i++) { //at first this part will not excute 
     FD_SET(clients[i], &read_set); 
    } 

    select(fd + num_clients + 1, &read_set, NULL, NULL, NULL); 


    if (FD_ISSET(fd, &read_set)) { 
     if ((clients[num_clients++] = accept(fd, NULL, NULL)) == -1) { 
      perror("accept error"); 
      continue; 
     } 
     printf("we got a connection!\n"); 
    } 


    for (i = 0; i < num_clients; i++) { 

     if (FD_ISSET(clients[i], &read_set)) { 
      msg = read(clients[i], buf, sizeof(buf)); 
      if (msg > 0) { 
       int savedclnt = clients[i]; 
       printf("client %d says: %s\n", i, buf); 

       for (int p = 0; p<num_clients; p++) 
       { 
        if (clients[p] != savedclnt) { 
         //write("from %d",clients[p]); 
         //char msg2 = strcat(clients[i],msg); 
         write(clients[p], buf, msg); 
        } 

       } 
      } 
     } 
    } 
} 
+0

Quels problèmes avez-vous avec le code que vous montrez? Quelle est ta question? S'il vous plaît prenez le temps de [lire sur la façon de poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask). –

+0

Le problème que j'ai eu, c'est que je ne peux pas penser à un moyen de faire le serveur écrire tous les messages qu'un client envoie sur le socket dans tous les autres clients. J'ai lu d'autres articles similaires ici et il était impuissant. –

+1

Pour commencer, je vous suggère soit d'essayer un [débogage canard en caoutchouc] (https://en.wikipedia.org/wiki/Rubber_duck_debugging) ou au moins passer par le code ligne par ligne dans un débogueur. C'est parce que vous avez des problèmes flagrants concernant votre manipulation de fil. En ce qui concerne votre problème, gardez une collection de tous les clients connectés, et lorsque vous lisez la boucle d'entrée sur cette collection pour écrire à tous les autres clients. Un tableau ou une liste de descripteurs de fichiers est un bon début. –

Répondre

0

Pour ce que vous faites, vous n'avez pas vraiment besoin de threads. D'après l'expérience personnelle, un serveur à un seul thread ferait bien le travail. Au lieu d'avoir le principal enveloppement corporel autour d'un appel à accept() vous devez utiliser select() pour voir quels descripteurs de fichiers ont entrée, quelque chose le long des lignes de ...

fd_set readfds; 
struct timeval timeout; 
unsigned int num_clients; 
unsigned int clients[100]; 
while(1) 
    { 
    FD_ZERO(&readfds); 
    FD_SET(sock, &readfds); 
    for(i=0; i<num_clients; i++) 
    { 
    FD_SET(clients[i],&readfds); 
    } 
    timeout.tv_sec=1; 
    timeout.tv_usec=0; 
    select(max_fds, &readfds, NULL, NULL, &timeout); 
    if(FD_ISSET(sock,&readfds)) 
    { 
    clients[num_clients++] = accept(sock,(struct sockaddr *)&server,&size); 
    } 
    for(i=0;i<num_clients;i++) 
    { 
    if(FD_ISSET(clients[i],&readfds)) 
     { 
     int err=read(clients[i],buf,1000); 
     if(err>0) 
     { 
     for(p=0;p<num_clients;p++) 
      { 
      write(clients[i],buf,err); 
      } 
     } 
     } 
    } 
    } 

Ce code est juste un exemple et a besoin d'une vérification d'erreur de voir si un client s'est déconnecté, un moyen de mettre à jour la liste des clients et de voir si un client est prêt à recevoir des données. Mais j'espère que cela vous donne l'idée de base où aller?

+0

je ne suis pas vraiment familier avec la méthode select() mais je mets à jour mon code avec un seul thread comme suggéré mais ne me donne toujours pas ce que je veux –

+0

j'ai mis à jour le code peut-être jeter un oeil. –

+0

la fonction 'select()' attend au plus une seconde ou jusqu'à ce que l'une des descriptions de fichiers dans le jeu de bits readfds ait une certaine entrée. –