【发布时间】:2017-01-29 10:06:07
【问题描述】:
我的应用程序类似于 libevent,使用 epoll(在级别触发模式下)检测 I/O 活动并调用回调来处理它。
我最近发现我的 TCP/IP 套接字正在阻塞,这是一个意外,但我仍然不希望 recv() 调用阻塞一个 FD,它被 epoll 报告为有读取活动未决.即使套接字出现错误,recv() 肯定会返回并告诉我。
我对此有什么误解?
在这种情况下,什么样的网络状况会导致recv() 阻塞?
【问题讨论】:
-
您是否将
MSG_WAITALL传递给recv()?在这种情况下,该函数可能会阻塞,即使某些(但不是全部)字节可能已经可用。 -
@RalphTandetzky:没有。
recv(fd, buf, BUFSIZE, 0); -
这通常是因为 epoll+recv 不是原子的,所以如果 epoll 和 recv 之间发生了其他事情,那么在你调用 recv 时,套接字可能不再准备好读取。但是,如果没有MVCE,就不可能说出您的情况会发生什么。
-
@ChrisDodd:我很想知道可能是什么“东西”。一个套接字怎么能在某一刻准备好,然后在没有错误条件的情况下没有准备好?至于 MCVE,我再也无法重现这个场景了 :( 因此我问的是 epoll/recv 不是一段代码。
-
如果有多个线程从套接字读取,就会发生这种情况。
标签: c++ linux networking tcp-ip epoll