2017-10-17 16 views
0

J'ai actuellement un problème avec le serveur POP3 qui est basé sur la fonction select(). Fondamentalement, le serveur contient plusieurs clients à la fois, mais le message de bienvenue envoie autant de fois que le nombre de clients connectés. This is an example of messages sent to clients.Le serveur envoie un message de bienvenue plus d'une fois à l'aide de select()

//file descriptor, array of clients 
fd_set readset; 
int sock_arr[30]; 
int max_fd, rc; 

servsock = socket(AF_INET, SOCK_STREAM, 0); 
/*...*/ 
max_fd = servsock; 

do 
{ 
FD_ZERO(&readset); 
FD_SET(servsock, &readset); 

for (int i = 0; i < 30; i++) { 
    rc = sock_arr[i]; 
    if (rc > 0) 
     FD_SET(rc, &readset); 
    if (rc > max_fd) 
     max_fd = rc; 
} 
activity = select(max_fd + 1, &readset, NULL, NULL, &timeout); 

if (activity < 0) 
{ 
perror(" select() failed"); 
break; 
} 

if (activity == 0) 
{ 
printf(" select() timed out. End program.\n"); 
break; 
} 

Le message est envoyé autant de fois que le nombre de client connecté par exemple si le premier client est connecté le message est envoyé une fois si deuxième client est connecté le message est envoyé deux fois, etc.

//here server accepts new connections 
if (FD_ISSET(servsock, &readset)) { 
    serv_socket_len = sizeof(addr); 
    peersoc = accept(servsock,(struct sockaddr *) &addr, &serv_socket_len); 
    if (peersoc < 0) { 
     error("Accept failed!\n", ERR_SCK); 
    } 
    else { 
     char message[256]; 
     strcat(message, reply_code[1]); 
     strcat(message, reply_code[3]); 
     strcat(message, reply_code[0]); 
     //Welcome message 
     send(peersoc, message, strlen(message), 0); 
     for (int i = 0; i < 30; i++) { 
      if (sock_arr[i] == 0) { 
       sock_arr[i] = peersoc; 
       break; 
      } 
     } 
    } 
} 
//server processing input messages from clients using threads 
/*...*/ 

Je ne sais pas quelles sont les causes que je suppose quelque chose avec des descripteurs de fichiers. S'il vous plaît donnez-moi quelques conseils si possible.

Répondre

0

J'ai oublié Résolu à effacer un tampon pour envoyer un message

... 
char message[256]; 
memset(message, 0, sizeof(message)); 
...