【问题标题】:Windows 2012 R2 closesocket() hangs on listening socketWindows 2012 R2 closesocket() 挂在侦听套接字上
【发布时间】:2018-12-23 21:14:59
【问题描述】:

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

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

两天前,我们更新了 Windows 2012 R2(它安装了最新的安全更新。上一次更新是 6 个月前)。在尝试停止服务更新后,我们在日志中看到服务器挂起以关闭侦听套接字

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 超时以进行关闭,但它没有帮助。

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

【问题讨论】:

  • 首先 - 查看调用 closesocket 的堆栈跟踪 - 代码挂在哪里。正在通话NtClose 或其他地方
  • @RbMm ntdll.dll!NtClose() mswsock.dll!SockCloseSocket() mswsock.dll!WSPCloseSocket() ws2_32.dll!closesocket() Unknown
  • 这意味着挂起是在内核模式驱动程序中。甚至不知道在这种情况下下一步该怎么做
  • @RbMm 删除 KB4338815 在我们所有的服务器上修复了这个问题。感谢您的帮助!
  • @MSchenkel 查看我在stackoverflow.com/questions/51372116/… 中的回答,了解微软针对该问题的补丁

标签: c++ windows sockets networking iocp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 2014-05-26
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2016-11-19
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多