我有一个通过tcpListener进行通信的服务。 问题是当用户重新启动服务时 - 抛出“正在使用的地址”异常,并且服务无法在几分钟左右启动。
有没有办法告诉系统终止旧连接,以便我可以打开一个新连接? (我不能只使用随机端口,因为服务无法通知客户端端口是什么,因此我们必须依赖于预定义的端口)
答案 0 :(得分:4)
在绑定到侦听端口之前设置SO_REUSEADDR
套接字选项。看起来相应的.NET代码类似于:
SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
答案 1 :(得分:1)
有一个原因是套接字关闭后不会使用一段时间。 套接字由4元组,源和目标端口,源和目标IP组成。
假设您在客户端忙于向服务器发送数据时强行关闭套接字。 等待5秒钟并使用相同的端口重新打开服务器,并且同一客户端将数据发送到同一个4元组,服务器将获得包含错误tcp序列号的数据包,并且连接将被重置。
你在脚下射击自己:)
这就是为什么连接具有2-4分钟的time_wait状态(取决于发行版),直到它们可以再次使用。 为了清楚起见,我说的是SOCKET,而不仅仅是监听tcp端口。