服务器使用select()多次发送欢迎消息

时间:2017-10-17 12:20:27

标签: select server client

我目前遇到基于select()函数的pop3服务器的问题。基本上,服务器一次保存多个客户端,但欢迎消息发送的次数与连接的客户端数量一样多。 This is an example of messages sent to clients.

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

我不知道是什么原因让我假设有文件描述符。如果可能的话,请给我一些建议。

1 个答案:

答案 0 :(得分:0)

解决了我忘记清除缓冲区以发送消息

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