【问题标题】:Socket servers on Windows VM on Azure stop listening on incomming requestsAzure 上 Windows VM 上的套接字服务器停止侦听传入请求
【发布时间】:2018-08-09 14:52:14
【问题描述】:

我在同一个 Windows VM 上运行了 100 个 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 服务端口被占用。 即使我将服务停止了一个小时,一旦出现问题,服务也无法再次启动。

  1. 什么是“占用”我的端口?
  2. 我需要为 VM 创建端点吗?
  3. 还有其他方法可以查看阻塞端口的原因吗?
  4. 即使我已经在监听端口,Azure 本身也会随机占用我的端口吗?

【问题讨论】:

  • 关闭具有大量套接字的套接字服务器可能需要一段时间才能清除;你确定这个过程已经死了吗?您是否完全关闭了侦听器?你是用 http.sys 来监听的吗?
  • 你我已经停止了故障服务几个小时,但无法再次启动它。它完全停止了。

标签: c# azure sockets virtual-machine


【解决方案1】:

根据报错信息,这个问题的原因是你有2个进程试图使用该端口并得到这个问题。

当我们使用.NET来使用操作系统的资源时,比如文件IO、网络等,这些都是非托管资源,我们需要在使用完这些资源后,正确的释放这些资源。

所以我认为套接字没有正确关闭,当服务重新启动时,它将无法绑定到端口,因为 Windows 可能不知道该进程已完成。

我们应该让我们的代码更加完善,并考虑所有的异常情况。

我们可以使用TcpListener.Stop方法正确关闭socket

【讨论】:

  • 不是我的任何服务主动接管了我的任何其他服务已经在使用的端口。错误消息仅在我的一项服务(使用 TcpListener)停止接受新连接后出现,即使这些服务仍在运行。
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多