.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,但该方案存在以下问题:
- 会丢失异常发生时已接收但尚未被应用处理的数据包
- 在关闭旧socket到创建新socket的间隙,对应端口无法为客户端提供服务
- 方案不够“规范”和“优雅”
因此想咨询针对该场景的“最优”“合规”解决方案是什么?
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

