gpt4 book ai didi

c++ - 选择返回零但有更多数据并且 recv 也有效

转载 作者:行者123 更新时间:2023-11-28 02:53:50 25 4
gpt4 key购买 nike

我正在使用 LibVNC 并通过打开日志(显示发送和接收的字节数)我可以看到服务器正在发送数据。但是我的客户在某个时候停止接收数据。我调试了它并发现:在我的客户端中,选择函数返回零值。尽管如果我通过调试器更改返回值,recv 会继续工作并按服务器发布的顺序接收数据。所以看起来一切正常。

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

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

有什么建议我应该在哪里挖掘以找到问题?

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;
}

最佳答案

select() 在其 timeout 时间段结束时返回 0,因此请仔细检查您的 timeout 是否准确。请记住,tv_sec 表示,tv_usec微秒(1/1000000 秒)表示。您的 usecs 参数用什么表示?在 Windows 编程中很少使用微秒,毫秒(1/1000 秒)更为常见。当 select() 返回 0 时,您在 usecs 参数中指定了什么值?很可能您没有正确处理 usecs,并且导致的 timeout 比您预期的要小得多。

关于c++ - 选择返回零但有更多数据并且 recv 也有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22447159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com