C# - TcpListener.Start()导致SocketException,消息“每个套接字地址只有一次使用”

时间:2012-06-04 15:10:52

标签: c# .net tcp network-programming

我有一个服务,因为它将在TcpListener实例上调用Start()方法。此侦听器使用的端口不常见,并且不知道是否由任何其他服务使用。非常非常罕见的一分钟左右它会遇到一个奇怪的错误。一分钟后,服务(失败时立即重启)背靠背崩溃,出现以下异常:

   SocketException
   at System.Net.Sockets.Socket.DoBind(System.Net.EndPoint, System.Net.SocketAddress)
   at System.Net.Sockets.Socket.Bind(System.Net.EndPoint)
   at System.Net.Sockets.TcpListener.Start(Int32)
   at MyTestServer.Server.StartListening()

如下所示的异常消息:

Only one usage of each socket address (protocol/network address/port) is normally permitted

This文章表明我遇到了端口耗尽问题,我应该调整注册表来修改WinSock的超时和端口范围值。这一切都很好,但我只有(或期望有)50-100个客户端连接。我怎么可能用完了端口?机器人和端口扫描仪?

1 个答案:

答案 0 :(得分:4)

可能不是因为它在那篇文章中的端口耗尽。他们正在与WCF(这就像TCPClient)连接。您绑定到TCP端口并等待连接。这不是严格相同的事情。您绑定到特定的TCP端口号。当您收到此消息时,Windows(正确与否)认为它正在使用中。 Windows报告另一个进程已绑定到该端口,因此您不能。您可以让2个进程尝试使用该端口并解决此问题,因此50-100数字不是问题。

要么是在其他地方导致此问题,要么是有其他应用程序导致此问题。

如果服务遇到问题并且在没有调用TCPListener.Stop()的情况下死亡,那么服务会自动重启,它将无法绑定到端口,因为窗口可能不知道进程已完成。

您必须发布更多详细信息才能进一步了解。