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