【问题标题】:Server sends Welcome message more than once using select()服务器使用 select() 多次发送欢迎消息
【发布时间】:2017-10-17 12:20:27
【问题描述】:

我目前遇到基于 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
/*...*/

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

【问题讨论】:

    标签: select server client


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2020-10-21
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      相关资源
      最近更新 更多