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

Val*_*tin 8 c++ sockets windows networking iocp

我在生产服务器上有一个奇怪的情况.

我们有在C++上编写的网络应用程序,它通过使用IOCP编写的TCP为用户提供请求.

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

closesocket(session->listen_socket);
Run Code Online (Sandbox Code Playgroud)

停止网络系统的模式是下一个:

  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超时以使得关闭,但它没有帮助.

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

Val*_*tin 6

这个问题是由微软KB4338815的补丁带来的,导致closesocket永远挂在英特尔至强处理器上,这也是由FileZilla的人在这个帖子中发布的 https://forum.filezilla-project.org/viewtopic.php?t=49308