为什么 TCP 连接状态没有从 CLOSE_WAIT 变为 CLOSED?

为什么 TCP 连接状态没有从 CLOSE_WAIT 变为 CLOSED?

我有一个客户端服务器应用程序在以下系统中运行:服务器:Windows Server 2008 R2 [标准] 客户端:Windows XP SP3

工作流程:服务器在端口 YY 监听客户端连接。客户端在端口 YY 连接到服务器。数据从服务器传输到客户端。服务器关闭套接字(使用重用选项,TF_REUSE_SOCKET)客户端关闭套接字。

问题:在正常情况下,当数据传输完成后,服务器会关闭套接字,一切正常。但是在客户端首先关闭套接字(用于取消数据传输)的情况下,服务器的套接字状态更改为 CLOSED_WAIT(因为服务器从客户端收到 FIN)。在客户端,套接字状态为 FIN_WAIT_2。此套接字状态永远保持。套接字根本没有被释放。

如果服务器也是 WindowsXP XP3,则相同的应用程序可以正常运行。

Windows2008 R2 中是否有任何设置使得我的应用程序不释放套接字(或将套接字状态从 CLOSED_WAIT 更改为 CLOSED_WAIT)?

注:我配置了[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters] TcpFinWait2Delay = 60 但是没用。

答案1

客户端未从服务器收到其发送给服务器的 FIN 的 ACK。我建议在客户端和服务器上进行数据包捕获,以查看发生了什么。

答案2

服务器代码有问题。它没有调用CloseSocket(或您正在使用的 API 中的等效代码),因此其连接句柄永远不会关闭。

相关内容