如何关闭(终止、释放)处于FIN_WAIT_2状态的套接字?

12

我有一个客户端应用程序,它使用未托管的dll与服务器通信。

所有与网络相关的操作都在未托管的dll内完成。在与服务器进行了大量操作后,客户端会耗尽TCP端口。 如果我们使用“netstat -an”检查网络状态,我们会得到以下结果:

...
TCP    192.168.11.55:56048    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56049    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56050    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56051    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56052    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56053    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56054    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56055    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56056    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56057    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56058    192.168.10.27:5000     FIN_WAIT_2
TCP    192.168.11.55:56059    192.168.10.28:5000     FIN_WAIT_2
TCP    192.168.11.55:56060    192.168.10.27:5000     FIN_WAIT_2
...

只有在客户端关闭后,端口才会被释放。

如果我在调试模式下运行VS项目,端口永远不会耗尽。 但是,在发布模式下运行时会发生这种情况。

我既没有服务器源代码也没有客户端源代码的访问权限。

如何释放或终止处于FIN_WAIT_2状态的端口?

2个回答

13

当一个套接字处于 FIN_WAIT_2 状态时,本地套接字已关闭并正在等待远程套接字发送他们的关闭请求。如果这个关闭请求永远不到达,该套接字将保持在 FIN_WAIT_2 状态一段时间。

其背后的原因是,如果来自远程方的关闭请求被延迟,并在另一个应用程序重用套接字之后才到达,那么新连接将立即关闭。

您可以更改超时时间,但最终未经管理的 dll 没有完全实现 TCP 关闭序列。更多信息请参见:

http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/how-to-close-finwait2-connections-except-reboot/ba2fed9f-8b61-4b71-ab5b-d39dc9a387e3


1
将超时设置为最小值确实有所帮助,但效果不大。最终,我们通过在客户端设置TCP_NODELAY参数来解决了这个问题。谢谢。 - ulughbekula
我曾经遇到过TcpClient连接MOXA的问题。将TcpClient属性NoDelay设置为true解决了我的问题。谢谢。 https://learn.microsoft.com/it-it/dotnet/api/system.net.sockets.tcpclient.nodelay?view=netframework-4.7.2 - Ezin82

1
当您关闭客户端套接字时,服务器端套接字将读取0字节。 此时,您应关闭服务器套接字。 连接将显示为带有PID0的TIME_WAIT,并最终消失。
我认为这就是最好的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接