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

Windows 来自另一个线程的套接字关闭调用是否总是会唤醒阻塞recv()线程?,windows,linux,sockets,freebsd,Windows,Linux,Sockets,Freebsd,我找不到太多的文档来说明这是否应该发生: 某些线程打开TCP(或其他流)套接字 线程1启动一个阻塞recv() 线程2使用shuth\RDWR(我认为是shuth\RD)调用套接字上的shutdown() 线程1现在从阻塞调用中“唤醒”,并返回零,就像另一方关闭其套接字时一样 这种行为出现在现代Linux和FreeBSD系统上。我没有和其他人一起测试过 微软MSDN帮助页面上的一条评论:表明这种行为在Windows中是“负责任的”;它还指出,“目前情况并非如此”,但这可能已经过时 是否在任何地方

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

  • 某些线程打开TCP(或其他流)套接字
  • 线程1启动一个阻塞recv()
  • 线程2使用shuth\RDWR(我认为是shuth\RD)调用套接字上的shutdown()
  • 线程1现在从阻塞调用中“唤醒”,并返回零,就像另一方关闭其套接字时一样
  • 这种行为出现在现代Linux和FreeBSD系统上。我没有和其他人一起测试过

    微软MSDN帮助页面上的一条评论:表明这种行为在Windows中是“负责任的”;它还指出,“目前情况并非如此”,但这可能已经过时


    是否在任何地方指定了这种行为?我能信赖它吗?

    我认为你不能信赖它。shutdown()初始化套接字关闭,但具体取决于特定情况。某些协议可能确实会立即关闭连接和套接字,从而唤醒休眠在该套接字上的进程。在其他情况下,关机只会启动协议状态机,但需要一段时间才能唤醒任何人。例如,已建立的TCP连接必须在几个状态之间转换,直到达到关闭状态。你最终会醒来,但你不能指望它马上发生