来自另一个线程的套接字关闭调用是否总是阻塞recv()线程被唤醒?

时间:2012-06-07 15:46:49

标签: windows linux sockets freebsd

我找不到太多文件说明这是否应该发生:

  1. 某个线程打开TCP(或其他流)套接字
  2. 线程1启动阻塞recv()
  3. 线程2使用SHUT_RDWR(或者我认为是SHUT_RD)调用套接字上的shutdown()
  4. 线程1现在从阻塞调用中“唤醒”,并返回零,就像另一方关闭其套接字一样。
  5. 此行为出现在现代Linux和FreeBSD系统上。我还没有和其他人一起测试过。

    此处对Microsoft MSDN帮助页面的评论:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx表明此行为在Windows中“负责”;它还指出“目前情况并非如此”,但这可能已经过时了。

    此行为是否在任何地方指定?我能依靠吗?

1 个答案:

答案 0 :(得分:1)

我认为你不能依赖它。 shutdown()initiales socket shutdown,但细节取决于具体情况。某些协议可能确实会立即关闭连接和套接字,这会唤醒在该套接字上休眠的进程。在其他情况下,关闭只是将协议状态机启动到行动中,但它需要一些时间才能达到唤醒任何人的意义。例如,已建立的TCP连接必须转换到几个状态,直到达到CLOSED状态。你最终会醒来,但你不能马上依赖它。