Windows 2012 R2 closesocket()挂在侦听套接字上

时间:2018-07-16 10:35:51

标签: c++ windows sockets networking iocp

我在生产服务器上的情况很奇怪。

我们有使用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超时来进行假性关闭的解决方案,但这没有帮助。

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

1 个答案:

答案 0 :(得分:6)

此问题是由Microsoft KB4338815 修补程序引起的,该补丁导致closesockett®永远挂在Intel Xeon处理器上,FileZilla伙计也在此线程中发布了此问题。 https://forum.filezilla-project.org/viewtopic.php?t=49308