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

UDP Socket接收异常:数据报超出缓冲区大小问题求助

问题分析与解决

核心问题

你代码里的缓冲区被意外覆盖是触发异常的关键:

  • 初始创建的dataBuffer是65536字节的大缓冲区,但随后执行dataBuffer = Encoding.ASCII.GetBytes(message);时,该变量被替换成了仅能容纳发送消息的小数组(比如"Some message"对应的数组长度仅为11)。当接收对方返回的UDP数据包时,若数据包大小超过这个小数组的长度,就会触发缓冲区不足的异常。

修复步骤

  1. 拆分发送与接收缓冲区
    发送消息时使用独立的字节数组,避免覆盖接收用的大缓冲区。
  2. 使用UDP专用的ReceiveFrom方法
    UDP是无连接协议,ReceiveFrom能更准确处理接收逻辑,同时获取发送方的端点信息,比Receive更适配UDP场景。
  3. 简化端点构建逻辑
    原GetRemoteEndPoint方法完全多余,直接通过目标IP和端口构建IPEndPoint即可,无需创建临时Socket并执行Connect操作。

修改后的代码

void Method()
{
    // 直接构建远程端点,替代原GetRemoteEndPoint方法
    IPEndPoint _remoteEndpoint = new IPEndPoint(IPAddress.Parse(TargetIp), 5002);
    // 固定大小的接收缓冲区,不被覆盖
    byte[] receiveBuffer = new byte[65536];
 
    var sourceEndpoint = new IPEndPoint(IPAddress.Parse(hostIP), 5003);
    Socket socket = new Socket(sourceEndpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(sourceEndpoint);
    
    // 发送消息使用独立数组
    string message = "Some message";
    byte[] sendBuffer = Encoding.ASCII.GetBytes(message);
    socket.SendTo(sendBuffer, _remoteEndpoint);
    
    socket.ReceiveTimeout = 30000;

    // 接收数据:使用ReceiveFrom
    EndPoint senderEP = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
    int receivedDataLength = socket.ReceiveFrom(receiveBuffer, ref senderEP);
    
    // 可选:处理接收到的数据,例如转换为字符串
    string receivedMessage = Encoding.ASCII.GetString(receiveBuffer, 0, receivedDataLength);
}

额外说明

  • UDP数据包的最大合法大小为65507字节(IP头20字节+UDP头8字节),65536字节的缓冲区足够覆盖所有合法UDP数据包。
  • 若仍出现异常,需检查对方发送的数据包是否超出UDP最大限制(这种情况属于非法数据包,需联系发送方修复)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:27:11