2017-10-17 53 views
0

我目前對基於select()函數的pop3服務器有問題。基本上,服務器一次保存多個客戶端,但歡迎消息的發送次數與連接客戶端的次數相同。 This is an example of messages sent to clients.服務器使用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; 
} 

消息被髮送多次,是連接的客戶端的數量例如 如果第一個客戶端連接,如果第二個客戶端連接到該消息被髮送一次 消息被髮送兩次等

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

我不知道是什麼原因導致我假設文件描述符的東西。如果可能,請給我一些建議。

回答

0

解決我忘了清除緩衝區發送消息

... 
char message[256]; 
memset(message, 0, sizeof(message)); 
... 
相關問題