gpt4 book ai didi

c - 如何使用 select() 知道新客户端是否正在连接到套接字

转载 作者:行者123 更新时间:2023-11-30 14:25:32 24 4
gpt4 key购买 nike

我的问题是:(使用 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...

解决方案? ^^

最佳答案

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

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。

关于c - 如何使用 select() 知道新客户端是否正在连接到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com