我怎样才能强行关闭TcpListener

时间:2010-06-07 19:44:57

标签: c# sockets tcp terminate tcplistener

我有一个通过tcpListener进行通信的服务。 问题是当用户重新启动服务时 - 抛出“正在使用的地址”异常,并且服务无法在几分钟左右启动。

有没有办法告诉系统终止旧连接,以便我可以打开一个新连接? (我不能只使用随机端口,因为服务无法通知客户端端口是什么,因此我们必须依赖于预定义的端口)

2 个答案:

答案 0 :(得分:4)

在绑定到侦听端口之前设置SO_REUSEADDR套接字选项。看起来相应的.NET代码类似于:

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

答案 1 :(得分:1)

有一个原因是套接字关闭后不会使用一段时间。 套接字由4元组,源和目标端口,源和目标IP组成。

假设您在客户端忙于向服务器发送数据时强行关闭套接字。 等待5秒钟并使用相同的端口重新打开服务器,并且同一客户端将数据发送到同一个4元组,服务器将获得包含错误tcp序列号的数据包,并且连接将被重置。

你在脚下射击自己:)

这就是为什么连接具有2-4分钟的time_wait状态(取决于发行版),直到它们可以再次使用。 为了清楚起见,我说的是SOCKET,而不仅仅是监听tcp端口。