【问题标题】:How to wait for receiving data from socket?如何等待从套接字接收数据?
【发布时间】: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

标签: c++ sockets timeout wait


【解决方案1】:

即使 select 报告它准备就绪,套接字也可能会阻塞。为避免这种阻塞,您应该在套接字上使用O_NONBLOCK。阅读manpage - mkaes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多