连续2次SELECT系统调用同一个fd(套接字)一次需要时间,第二次立即返回,为什么?

时间:2011-11-08 14:55:28

标签: c++ sockets select tcp kernel

我在同一个fd上一个接一个地跟2'选择'调用。两者都有diff fd_set,但两者只有一个fd int和相同的fd。(试图从同一个套接字读取)

问题是第二次选择超时。 我试图重新创建这个问题,但是在我的测试中,第二个选择几乎瞬间完成,即使超时= 0。

我很困惑。套接字是否在内核空间中有数据,因为第二个选择会立即通过。

1 个答案:

答案 0 :(得分:1)

是的,套接字确实在内核空间中缓冲了传入数据 - 这是在第一次read()返回后调用select()时得到的内容,表示有可读的内容。如果您还没有阅读,那么当然另一个select()将立即返回。

如果您 调用了read(),那么它可能表示可用​​的数据比您阅读的数据还多,您应该继续阅读,直到您完成所有操作。如果对read()的调用失败或在select表示可读之后阻塞,或者您有理由相信在您已阅读的内容之后应该没有数据,则此处只有一个问题