【问题标题】:select() function fails in winsockwinsock 中的 select() 函数失败
【发布时间】: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() 时再次明确地将其设置为正确的值。

标签: c select winsock winsock2


【解决方案1】:

简单的错字:

if (t = SOCKET_ERROR)

应该是:

if (t == SOCKET_ERROR)

【讨论】:

  • 在 15 个小时的编码之后,我错过了那个细节。然后我意识到了。不过还是谢谢你
  • 始终在启用完整警告的情况下进行编译。我很确定这条线会显示为警告。
  • 我正在使用 gcc,但不幸的是它没有
  • 使用gcc -Wall,我收到了这个警告:warning: suggest parentheses around assignment used as truth value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多