0

我的问题是:(使用 select())我如何知道新客户端是否正在连接我的服务器?A 不能只使用接受,因为接受()正在阻塞......

示例:我在 fd user1 (fd = 4) 和 user2 (fd = 5) 上设置了两个客户端。所以,我使用 select 来知道谁在套接字上写:

  FD_ZERO(read_fds);
  FD_SET(user1, read_fds);
  FD_SET(user2, read_fds);
  error = select(user2 + 1, read_fds, NULL, NULL, NULL);
  if (FD_ISSET(user1, read_fds) == 1)
     printf("user1 talks.\n");
  ...

但我想知道是否有新用户连接到服务器,我该怎么办?我试过了:

  FD_ZERO(read_fds);
  FD_SET(user1, read_fds);
  FD_SET(user2, read_fds);
  FD_SET((user2 + 1), read_fds);
  error = select(user2 + 2, read_fds, NULL, NULL, NULL);
  if (FD_ISSET(users2 + 1) == 1)
  {
      printf("New user.\n");
      accept(..., ...);
  }
  ...

但是使用此代码,每次都选择 return -1 ...

一个办法 ?^^

4

1 回答 1

2

您必须将连接的客户端存储在某处,例如列表。

struct client_node
{
    int sockfd;
    /* Other data that might be needed */
    struct client_node *next;
};

struct client_node *client_list = NULL;

/* ... */

FD_ZERO(&read_fds);
FD_SET(listening_socket, &read_fds);

int maxfd = listening_socket;

for (struct client_node *c = client_list; c; c = c->next)
{
    FD_SET(c->sockfd, &read_fds);
    maxfd = MAX(maxfd, c->sockfd);
}

int res = select(maxfd + 1, &read_fds, NULL, NULL, NULL);

至于阻塞问题accept,如您所见,我添加了一个套接字(变量listening_socket),它是您正在侦听的套接字。当select说您可以从中读取时,这意味着有一个新连接并且您可以调用接受。

于 2012-04-19T12:32:13.310 回答