为什么TCP连接状态不能从CLOSE_WAIT变为CLOSED?

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

工作stream:服务器在YY端口监听客户端连接。 客户端连接到端口YY的服务器。 数据从服务器传输到客户端。 服务器closures套接字(带重用选项,TF_REUSE_SOCKET)客户端closures套接字。

问题:在正常情况下,数据传输完成后服务器closures套接字,一切工作正常。 但在客户端首先closures套接字(取消数据传输)的情况下,套接字状态@服务器更改为CLOSED_WAIT(因为服务器从客户端接收FIN)。 在客户端,FIN_WAIT_2中的套接字状态。 这个套接字状态永远保持。 sockets没有释放。

如果服务器也是WindowsXP XP3,相同的应用程序工作正常。

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

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

客户端没有收到服务器发送给服务器的FIN的ACK。 我build议在客户端和服务器上放一个数据包捕获来查看发生了什么事情。

服务器代码已损坏。 它不调用CloseSocket (或者你正在使用的API中的等价物),所以它的连接句柄永远不会closures。