2012-05-20 37 views
7

我有一个客户端应用程序,它使用非托管dll与服务器进行通信。如何关闭(kill,release?)处于FIN_WAIT_2状态的套接字?

所有与网络相关的操作都在非托管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状态的端口?

回答

7

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

+0

将超时设置为最小值确实有帮助,但不是很多。最后我们通过在客户端设置TCP_NODELAY参数来解决问题。谢谢。 – ulughbekula

+0

mac OS X呢? –

1

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

我认为这是一样好。