非阻塞套接字上的select(),recv()和EWOULDBLOCK

mrv*_*nzo 9 c c++ sockets

我想知道以下情况是否真实?!

  1. 非阻塞TCP套接字上的select()(RD)表示套接字已就绪
  2. 以下recv()将返回EWOULDBLOCK,尽管调用select()

dwc*_*dwc 5

因为recv()您会得到EAGAIN而不是EWOULDBLOCK,是的,这是可能的。由于您刚刚检查过,select()因此发生了两件事之一:

  • 其他东西(另一个线程)耗尽了select()和之间的输入缓冲区recv()
  • 在套接字上设置了接收超时,超时超时,但未接收到数据。

  • #define EWOULDBLOCK EAGAIN / *操作将阻止* /-在许多操作系统上都可以找到 (3认同)

jam*_*att 3

我知道流行的桌面操作中存在一个错误,其中O_NONBLOCKTCP 套接字(尤其是那些在环回接口上运行的套接字)有时会在报告套接字已准备好读取后EAGAIN返回。就我而言,这种情况发生在另一方半关闭发送流之后。recv()select()

t_nx.ml有关更多详细信息,请参阅我的 OCaml 网络应用程序环境发行版的 NX 库中的源代码。(关联