【发布时间】:2014-11-30 19:08:35
【问题描述】:
我正在制作一个 udp 客户端。我正在使用 select 函数来实现超时:
FD_ZERO(&stReadFDS);
FD_SET(clientSock, &stReadFDS);
int t = select(1, &stReadFDS, NULL, NULL, &sTimeOut);//first parameter of select is ignored in winsocks
if (t = SOCKET_ERROR) {
fprintf(stderr, "Call to select() failed");
exit(1);
}
if (t != 0) {
if (FD_ISSET(clientSock, &stReadFDS)) {
//recvfrom(...)
}
}
每次选择函数都返回一个 SOCKET_ERROR。 我做错了什么?
【问题讨论】:
-
你应该发布更多代码,问题可能出在套接字设置中
-
我不这么认为。因为当我删除选择并写recvfrom而不是它时,它可以工作
-
您的 sTimeOut 设置是否合理?例如如果设置为负值,select() 可能会失败。还要记住,调用 select() 可能会更改 sTimeOut,因此通常需要在每次调用 select() 时再次明确地将其设置为正确的值。