我在同一Windows VM上运行了几百个Windows服务安装。 他们每个人都监听2个端口,例如10050和60050。
每天有几次服务不再接受新的传入连接。
重新启动服务时,出现以下异常。
System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket address (protocol/network address/port) is normally permitted
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at System.Net.Sockets.TcpListener.Start(Int32 backlog)
at SocketServerAsync.AsynchronousSocketListener.Start()
运行netstat -ano时,使用我的端口看不到任何东西。
要重新启动服务,我必须更改端口号。
编辑1 每个服务侦听2个端口,其中一个是WCF服务,另一个是TcpListener。当我正常重启它们时,它就可以正常工作。大多数情况下,它的TcpListener端口被其他人使用,但是确实发生了WCF服务端口被占用的情况。 即使我停止了一个小时的服务,一旦出现问题,该服务也无法再次启动。
答案 0 :(得分:0)
根据错误消息,此问题的原因是您有两个尝试使用端口并得到此问题的进程。
当我们使用.NET使用操作系统资源时,例如文件IO,网络等。这些都是非托管资源,在使用完这些资源后,我们需要正确释放这些资源。
所以我认为套接字无法正常关闭,并且当服务重新启动时,它将无法绑定到端口,因为Windows可能不知道该进程已完成。
我们应该让我们的代码更加完善,并考虑所有异常情况。
我们可以使用方法TcpListener.Stop
正确关闭套接字