10

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

所有与网络相关的操作都在非托管 dll 中进行。在与服务器进行多次操作后,客户端的 TCP 端口已用完。如果我们使用“netstat -an”检查 netwotk 的状态,我们会得到以下结果:

...
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 状态的端口?

4

2 回答 2

11

当套接字处于 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

于 2012-05-21T08:36:19.920 回答
1

0 bytes当您关闭/关闭客户端套接字时,服务器端套接字将读取。
此时,您应该关闭/关闭服务器套接字。您的连接将显示为TIME_WAITPID0最终消失。

我认为这是最好的。

于 2013-03-25T19:22:35.650 回答