代码之家  ›  专栏  ›  技术社区  ›  Nissim

我怎样才能强行关闭一个tcplistener

  •  4
  • Nissim  · 技术社区  · 14 年前

    我有一个通过tcplistener进行通信的服务。 问题在于,当用户重新启动服务时,会引发一个“地址已在使用”异常,并且该服务在几分钟左右的时间内无法启动。

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Greg Hewgill    14 年前

    设置 SO_REUSEADDR 绑定到侦听端口之前的套接字选项。相应的.NET代码如下所示:

    SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
    
        2
  •  1
  •   eitama    14 年前

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

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

    你在开枪打自己的脚:)

    这就是为什么连接的时间等待状态为2-4分钟(取决于发行版),直到它们可以再次使用。 为了清楚起见,我所说的是套接字,而不仅仅是侦听TCP端口。