选择返回零,但有更多的数据和recv工作

时间:2014-03-17 04:46:25

标签: c++ windows sockets winsock vnc

我正在使用LibVNC并打开日志(显示发送和接收的字节)我可以看到服务器正在发送数据。但我的客户在某些时候停止接收数据。 我调试它并进入:在我的客户端select函数返回零值。 虽然如果我通过调试器更改返回值,recv将继续工作并按服务器发布的顺序接收数据。所以似乎一切都运转良好。

我在同一台机器上运行客户端和服务器,所以使用localhost。

我不知道它是否有帮助,但这是一段返回零的代码。

任何建议我应该在哪里挖掘才能找到问题?

int WaitForMessage(rfbClient* client,unsigned int usecs)
{
  fd_set fds;
  struct timeval timeout;
  int num;

  timeout.tv_sec=(usecs/1000000);
  timeout.tv_usec=(usecs%1000000);

  FD_ZERO(&fds);
  FD_SET(client->sock,&fds);

  num=select(client->sock+1, &fds, NULL, NULL, &timeout);
  if(num<0) {
    errno=WSAGetLastError();
    rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno));
  }

      return num;
}

1 个答案:

答案 0 :(得分:2)

select()在其timeout期过后返回0,因此请仔细检查timeout是否准确。请注意,tv_sec表示为tv_usec表示为微秒(1/1000000秒)。您的usecs参数表示的是什么?在Windows编程中使用微秒是非常不寻常的,毫秒(1/1000秒)更常见。当usecs返回0时,您在select()参数中指定了什么值?您可能无法正确处理usecs,并且生成的timeout比您预期的要小得多。