winsock 中的 select() 函数失败
Posted
技术标签:
【中文标题】winsock 中的 select() 函数失败【英文标题】:select() function fails in winsock 【发布时间】: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() 时再次明确地将其设置为正确的值。 【参考方案1】:简单的错字:
if (t = SOCKET_ERROR)
应该是:
if (t == SOCKET_ERROR)
【讨论】:
在 15 个小时的编码之后,我错过了那个细节。然后我意识到了。不过还是谢谢你 始终在启用完整警告的情况下进行编译。我很确定这条线会显示为警告。 我正在使用 gcc,但不幸的是它没有 使用gcc -Wall
,我收到了这个警告:warning: suggest parentheses around assignment used as truth value
。以上是关于winsock 中的 select() 函数失败的主要内容,如果未能解决你的问题,请参考以下文章