gpt4 book ai didi

c++ - udp 选择超时问题。超时或从所有客户端读取

转载 作者:行者123 更新时间:2023-11-28 06:59:28 26 4
gpt4 key购买 nike

我正在使用 select 来处理 udp 服务器上的连接。如果我在一段时间内没有收到数据包,我想超时。问题是,我似乎可以正确超时并且只从一个客户端读取,或者从所有客户端读取而不超时。

此功能的不同之处在于要选择的第一个参数,int nfds

这是我的代码:

int TIMEOUT = 5;
for (;;) {
FD_ZERO(&read_handles);
FD_SET(udpFD, &read_handles);

timeout.tv_sec = TIMEOUT;
timeout.tv_usec = 0;
if (select(udpFD+1, &read_handles, NULL, NULL, &timeout) == 0) {
printf("Select has timed out...\n");
return 1;
} else {
int length = 1;
if (FD_ISSET(udpFD, &read_handles)) {
//process read.
}
}
}

这个版本不会超时。如果我将选择行更改为:

if(select(udpFD, &read_handles, NULL, NULL, &timeout) == 0)

它确实超时,但它只从我的一个客户那里接收数据。

udpFD 是我正在查看的唯一句柄,但它的值为 4,因为它不是我创建的第一个描述符。我不知道这是否会有所不同,因为它是最大值。

我怎样才能超时并从我的两个客户端获取数据?

最佳答案

使用 if(select(udpFD+1, &read_handles, NULL, NULL, &timeout) == 0) 是正确的方法。

这会起作用。

我的错误是后来在代码中我没有重置我读取的长度字段,并且卡在了 recvfrom 循环中,并且只调用了一次 select。

关于c++ - udp 选择超时问题。超时或从所有客户端读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703572/

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