我怎样才能强行关闭TcpListener

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

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

在绑定到侦听端口之前设置SO_REUSEADDR套接字选项。 它看起来像相应的.NET代码是这样的:

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

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

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

你是在脚下射击自己:)

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