c++ - Windows 2012 R2 closesocket() 卡在监听套接字上

标签 c++ windows sockets networking iocp

我在生产服务器上遇到了一个奇怪的情况。

我们有一个用 C++ 编写的网络应用程序,它通过使用 IOCP 编写的 TCP 服务于用户请求。

两天前我们对 Windows 2012 R2 进行了更新(它安装了最新的安全更新。上一次更新是 6 个月前)。在尝试停止服务时更新后,我们在日志中看到服务器 hangs on call to close listening socket

closesocket(session->listen_socket);

停止网络系统的方案如下:

  1. PostQueuedCompletionStatus(m_completion_port, 0, NULL, NULL); x 工作线程数

  2. 等待所有工作线程完成他们的工作

  3. CloseHandle(m_completion_port);

  4. closesocket(session->accept_socket);

    closesocket(session->listen_socket);

这在过去的 4 年里运行良好,但在 Windows 2012 R2 更新后服务器突然挂起 closesocket(session->listen_socket);

我也曾尝试过将 LINGER 选项设置为 0 超时来阻止关闭,但它没有帮助。

关于如何解决此问题或进行任何其他诊断的所有想法?

最佳答案

这个问题是由 Microsoft KB4338815 的补丁引起的,它导致 closesocket 在 Intel Xeon 处理器上永远挂起,这个问题也被 FileZilla 的人发布在这个线程中 https://forum.filezilla-project.org/viewtopic.php?t=49308

关于c++ - Windows 2012 R2 closesocket() 卡在监听套接字上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51359861/

相关文章:

c++ - 如何删除聊天中的多余字符? C++

C++ printf 问题 : How can I safely pass a char* to printf?

node.js - Windows 环境变量未在 node.js 中返回

windows - 克隆 Windows 操作系统时 BIOS UUID 会相同吗?

c - 如何更改C语言程序的默认图标?

sockets - 如何在 openssl 中管理错误队列(SSL_get_error 和 ERR_get_error)

c++ - 添加到结构 vector 时出现 Stanford CS 106B 错误 — 编译器问题?

c++ - c.foo() 和 c.parent::foo() 之间的区别

c++ - 使用 clang-format 3.6 的 cpp 模板 <> 间距未按预期工作

Java 套接字重用