gpt4 book ai didi

c - 尝试从文件描述符读取事件时选择 block

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:23 25 4
gpt4 key购买 nike

我正在尝试创建一个接受多个客户端的服务器。这是我的代码的一部分。我的服务器需要监听两个端口。实现此目的的 socketsfd_servfd_comm

使用 selectnonblock 文件描述符,不幸的是没有给我想要的输出。问题是 select accepts 第一个 client 然后阻塞,并且不读取来自其他 client 的消息.

同样出于某种原因,如果我不使用 usleep(100000) 命令,我的程序会成功接受但不会继续。

感谢任何帮助。

FD_ZERO(&set);
FD_SET(fd_serv, &set);
FD_SET(fd_comm, &set);
while (1)
{
if (select (max_fd + 1, &set, NULL, NULL, NULL) < 0)
{
perror ("select");
exit (EXIT_FAILURE);
}

for (i = 1; i < max_fd + 1; i++)
{
usleep(100000);
if (FD_ISSET (i, &set))
{
if (i == fd_serv) //Connection request on original socket.
{
new_serv = accept (fd_serv, (struct sockaddr *) &client_serv_addr, &sin_len_serv);
if (new_serv < 0){ perror ("accept"); exit (EXIT_FAILURE); }
fd_set_blocking(new_serv, 0);
FD_SET(new_serv, &set);
max_fd = max(max_fd, new_serv);
}
else if (i == fd_comm) //Connection request on original socket.
{
new_comm = accept (fd_comm, (struct sockaddr *) &client_comm_addr, &sin_len_comm);
if (new_comm < 0){ perror ("accept"); exit (EXIT_FAILURE); }
fd_set_blocking(new_comm, 0);
FD_SET (new_comm, &set);
max_fd = max(max_fd, new_comm);
}
else if (i == new_comm) //Activity on already connected socket
{
if (read_command(fd_comm, i, start_time) == 1)
{
close(i);
FD_CLR(i, &set);
return SHUTDOWN;
}
}
else if (i == new_serv) //Activity on already connected socket
{
read_service(i);
close(i);
FD_CLR(i, &set);
}
}
}
}

最佳答案

你的问题在这里:

FD_ZERO(&set);
FD_SET(fd_serv, &set);
FD_SET(fd_comm, &set);
while (1)
{
[...]

您只设置了一次fd_set,但是您的fd_set 将被select() 调用修改,因此您需要每次循环迭代设置一次。试试这个:

while (1) 
{
FD_ZERO(&set);
FD_SET(fd_serv, &set);
FD_SET(fd_comm, &set);
const int max_fd = (fd_serve > fd_comm) ? fd_serve : fd_comm;
[...]

...在 select() 调用之后,您唯一应该调用的与 select() 相关的是 FD_ISSET() .所有其他的东西都是毫无意义的,因为你额外的 FD_SET()FD_CLR() 调用正在修改你正要访问的 fd_set在下一个 while 循环迭代开始时使用 FD_ZERO() 调用清除干净。

此外,作为旁注:usleep(10000) 调用应该消失——如果您正确调用 select(),则休眠任意时间段select() 之外既没有必要也不可取。

关于c - 尝试从文件描述符读取事件时选择 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50477356/

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