2012-06-04 44 views
3

我有一个服务,当它开始调用TcpListener实例的Start()方法时。此侦听器正在使用一个不常见且不被任何其他服务使用的端口。很少有一分钟左右,它会遇到一个奇怪的错误。一分钟的服务(其上立即重新启动失败)背靠背崩溃以下异常:C# - TcpListener.Start()导致SocketException的消息“每个套接字地址只有一个用法”

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个客户端连接。我怎么可能用完端口?机器人和端口扫描仪?

+0

您是否绑定到特定的IP地址以及端口号? – EJP

回答

4

它可能不是港口枯竭,因为它在那个职位。他们连接出WCF(这将像TCPClient)。您绑定到TCP端口并等待连接。这不完全是一回事。您绑定到特定的TCP端口号。当您收到此消息时,Windows(正确与否)认为它正在使用中。 Windows正在报告另一个进程已经绑定到该端口,所以你不能。你可以有2个进程试图使用该端口并得到这个问题,所以50-100的数字不是问题。

要么您在其他地方导致此问题,要么导致此问题存在其他某个应用程序。

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

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

+0

是的,当我发布后,我意识到我没有指定我是否使用普通端口。总之,我不是。此端口仅用于我的服务,也是该端口的唯一侦听器,并且在服务启动时仅调用一次Start()。也不,我没有在终于叫Stop()。将添加在。 – kmarks2

+1

然后,我会说问题是在开始体验这个之前,套接字没有正常关闭。最终,Windows意识到这个过程已经结束并释放资源,但在这之前不会造成这个问题。抛出一个异常和死亡(或其他可能阻止.Stop()被调用的东西)? – Tremmors

相关问题