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

标签 windows linux sockets freebsd

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

  1. 某个线程打开一个 TCP(或其他流)套接字
  2. 线程 1 开始阻塞 recv()
  3. 线程 2 使用 SHUT_RDWR(或者我认为是 SHUT_RD)在套接字上调用 shutdown()
  4. 线程 1 现在从其阻塞调用中“醒来”,并返回零,就像另一方关闭其套接字时一样。

此行为出现在现代 Linux 和 FreeBSD 系统上。我还没有用任何其他人测试过它。

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

是否在任何地方指定了此行为?我可以依靠它吗?

最佳答案

我不认为你可以依赖它。 shutdown() 初始化套接字关闭,但细节取决于特定情况。某些协议(protocol)可能确实会立即关闭连接和套接字,这会唤醒在该套接字上休眠的进程。在其他情况下,关闭只是将协议(protocol)状态机启动,但需要一些时间才能达到唤醒任何人都有意义的程度。例如,已建立的 TCP 连接必须经过几个状态才能达到 CLOSED 状态。你最终会醒来,但你不能指望它马上发生。

关于windows - 来自另一个线程的套接字关闭调用是否总是使阻塞的 recv() 线程唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935267/

相关文章:

c++ - EvtArchiveExportedLog 失败并显示 ERROR_DIRECTORY

windows - 是否可以从终端服务远程应用程序在本地运行程序?

c++ - 强制将文件写入磁盘

python - 我可以从 python 脚本运行 shell 函数吗?

sockets - 什么是 Socket.IO 发送和获取数据(确认)?

java - 序列化对象数组以通过套接字发送

python - lxml 中的解析函数出错

windows - 是否可以在 windbg 调试 session 中将缺失的符号添加到公共(public)符号?

linux - 本地网络中的 NTP

Java Socket 为什么服务器无法回复客户端