【问题标题】:How to know if a new client is connecting to a socket with select()如何知道新客户端是否正在使用 select() 连接到套接字
【发布时间】:2012-04-19 12:26:39
【问题描述】:

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

示例: 我在 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...

解决方案? ^^

【问题讨论】:

    标签: c sockets select


    【解决方案1】:

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

    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 说你可以读取它时,这意味着有一个新的连接,你可以调用accept。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2010-12-20
      • 2016-11-09
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多