UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
UDP socket select() returns 1 without delay (timeout) under some conditions
我在开发客户端应用程序时遇到了问题。
我想在我的应用程序中使用非阻塞 UDP 套接字与服务器通信。我正在使用Windows上的winsock2
库。
但。。。出于某种原因,我在某些情况下select()
功能有奇怪的行为:
- 没有绑定地址和端口(它是客户端套接字,所以不需要它(。
- 在
select()
之前,我通过调用将数据发送到我的本地地址和某个端口sendto
。- 例如:
192.168.1.2
- 例如:
在这些条件下,select()
立即(甚至无需等待超时(返回1
。就像我有一些数据包准备好接收一样。 但如果打电话recvFrom
那么它肯定会返回-1
。
- 如果我将数据包从客户端发送到任何其他地址(不是我在 LAN 上的地址(,则
select()
按预期工作。 - 此外,如果在调用
select()
之前不向任何地址发送任何数据包,select()
按预期工作。
套接字初始化方法:
bool CUdpSocket::initialize()
{
_handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
... error processing code, returns false if error...
}
使用select()
的方法。此方法适用于服务器套接字(具有绑定地址和端口(。
bool CUdpSocket::waitData(s32 timeout_ms)
{
fd_set readset;
int result;
struct timeval tv;
// Initialize the set.
FD_ZERO(&readset);
FD_SET(_handle, &readset);
// Initialize time out struct.
tv.tv_sec = 0;
tv.tv_usec = timeout_ms * 1000;
result = select(_handle + 1, &readset, NULL, NULL, &tv);
// Timeout with no data.
if (result == 0) {
return false; // Get out of here!
}
// Error.
if (result < 0) {
// TODO: Maybe throw exception or do something.
return false;
} else if (!FD_ISSET(_handle, &readset)) {
return false; // No data!
}
// There is some data!
return true;
}
如果您从未绑定的 UDP 套接字发送数据包,操作系统将为您选择一个可用的端口并将套接字绑定到该端口 - UDP 协议要求发送端口具有要发送的地址。
因此,如果您发送的数据包产生响应,那么选择返回 1 是完全有意义的 - 这是对您发送的数据包的响应。
相关文章:
- 如何仅为一个函数添加延迟
- C++减少modbus_connect超时
- 以在Qt中的IF语句中设置时间延迟
- 没有超时的C++条件变量
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 如何在C++(VS2010)中设置超时读取USB端口?
- 将自定义函数传递到基抽象类中以延迟执行
- C++卷曲柱在curl_easy_perform超时
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- 如何在 c++ 中延迟?
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 如何测量管道延迟?
- 获取毫秒延迟的错误值
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的子类的属性是延迟初始化的
- C++:函数外部的超时功能
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 字节间延迟时间的读取文件超时