【发布时间】:2015-12-20 10:44:55
【问题描述】:
我在 C++ 中创建了 wait_for_data 函数,但不能正常工作。
在下面的代码中 numReady 总是为真;为什么?
struct timeval selTimeout;
selTimeout.tv_sec = timeout / 1000;
selTimeout.tv_usec = (timeout % 1000) * 1000;
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(sock, &readSet);
int numReady = select(sock + 1, &readSet, NULL, NULL, &selTimeout);
if (numReady>0) {
// reading data here
} else {
//finish
}
谢谢
【问题讨论】:
-
什么不起作用。这是一个问答网站,我们不会调试您的代码。
-
谢谢你,我改变了问题。我在 synapse freepascal 类 (TTCPBlockingSocket) 中发现类似于此代码并尝试将其转换为 c++ 但我不知道为什么此代码在 cpp 中不起作用?
-
你为什么会期待别的东西。如果 select 返回的值大于零,则在
fd_set结构中设置了位。因此,在您的情况下,您的套接字已准备好读取。 -
没错,但是当调用 read 函数从套接字读取数据时,不会收到任何数据,应用程序会冻结,直到客户端关闭套接字以发送更多数据。
-
假设你在 linux 上。即使 select 报告它准备就绪,套接字也可能会阻塞。为避免这种阻塞,您应该在套接字上使用
O_NONBLOCK。阅读manpage