You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.8 UDP服务SocketException最优合规解决方案咨询

UDP Socket 10054异常的最优解决方案咨询

我有一个基于.NET Framework 4.8的Windows服务应用,通过UDP收发数据。随机出现的情况是,在某一端口调用socket.BeginReceiveFrom时,会抛出错误代码为10054的SocketException,异常描述为:The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress(连接因保活检测到操作过程中的故障而中断)。

相关代码片段(未包含完整错误处理)

private Socket serverSocket = null;
private byte[] byteData = new byte[1024];
private void DoReceiveFrom(IAsyncResult iar)
{
   EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
   int dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);

   if (dataLen > 0)
   {
     // 处理数据逻辑            
   }

   EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);

   // 此处随机抛出异常
   this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, newClientEP);
        
}

异常详情

System.Net.Sockets.SocketException (0x80004005): The connection has been broken due to keep-alive activity detecting a failure while the operation was in progress
   at System.Net.Sockets.Socket.DoBeginReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint endPointSnapshot, SocketAddress socketAddress, OverlappedAsyncResult asyncResult)
   at System.Net.Sockets.Socket.BeginReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP, AsyncCallback callback, Object state)

场景说明

  • 约10000个同时“连接”的客户端(蜂窝网络连接的远程控制器)
  • 程序监听约30个UDP端口,控制器大致均匀分布在各端口
  • 每个控制器每分钟收发约10个小数据包

我无法像部分网络帖子建议的那样忽略该错误,因为BeginReceiveFrom抛出异常后,socket无法再接收其他数据。

我目前找到的可行方法是关闭当前socket并重新创建绑定到同一端口的新socket,但该方案存在以下问题:

  1. 会丢失异常发生时已接收但尚未被应用处理的数据包
  2. 在关闭旧socket到创建新socket的间隙,对应端口无法为客户端提供服务
  3. 方案不够“规范”和“优雅”

因此想咨询针对该场景的“最优”“合规”解决方案是什么?

内容的提问来源于stack exchange,提问作者Oleg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:30