首页 文章

c#,socket无法接收分片的UDP数据包

提问于
浏览
1

我有一个嵌入式设备,它通过以太网直接连接到我的电脑 .
该设备通过UDP将音频流式传输到PC,并发送4096字节的UDP数据包 .

鉴于此,以太网的MTU是1500字节,数据包将被分段 .

在PC上我有一个c#程序试图接收数据包并对其进行解码 . UDP接收器在有效载荷不足1500字节时可以很好地接收数据包,但是它不能接收分段数据包 .

我通过Wireshark监控了传入的数据包,我可以看到数据包没有任何故障也没有丢弃 .

我不知道问题是在我的代码或C#套接字是无法接收这些类型的数据包 . 在这两种情况下,解决方案是什么?

1st Attempt: (usinfg Socket)

Socket sokcet = new Socket(SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any,5222);
sokcet.Bind(ep);
int counter = 0;
while (true)
{
     if(sokcet.Available > 0){
          byte[] bytes = new byte[sokcet.Available];
          int receivedBytes = sokcet.Receive(bytes);

          string print = String.Format("Packet Received : {0},{1}", receivedBytes, counter);
          Console.WriteLine(print);
     }
}

2nd Attempt: (using UDPClient)

IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
UdpClient listener = new UdpClient(listenPort,AddressFamily.InterNetwork);
while (!done)
{        
     byte[] bytes = listener.Receive(ref groupEP);
}

它们都不适用于大于1500字节的数据包 .

Screen shot of wireshark

Update 1: 我测试了环回(127.0.0.1)中的场景,我可以很好地接收4k UDP消息 .

Update 2: @Evk我通过交换机和路由器测试了连接到我的另一台PC的场景 . 现在我确信C#没有任何问题 . 不确定操作系统(win7 ultimate 64x) .
我的嵌入式设备使用LWIP,当用户使用LWIP发送大型UDP数据包时,会出现类似情况的报告 . 但我不确定这是我的情况 .
我甚至检查了UDP数据包's Source and Destination address, Checksum and ... and I can' t弄清楚为什么操作系统丢弃我的数据包 . 是否有任何工具可以分析网络数据包,以告诉他们是否有任何问题?

1 回答

  • 1

    我确定消息实际上是传递给进程的UDP接收队列 . 您可能会看到wireshark,但这并不能保证以后不会丢弃或在UDP协议级别进行过滤 .

    我会打开一个命令窗口(CMD),并在发送流量并运行解码应用程序时循环运行(另外,停止其他可能使用UDP的应用程序,因为它们可能会干扰这些数字):

    > netstat -s -p udp
    
    UDP Statistics for IPv4
    
      Datagrams Received    = 48775          <======= [This *should* increase]
      No Ports              = 83823          
      Receive Errors        = 16367          <====== [ WATCH THIS]
      Datagrams Sent        = 130194
    

    如果你注意到当你的应用程序在那里时接收错误并且似乎没有处理......那么由于某种原因,有可能由于UDP丢弃> 1500字节的数据包 . 您可能需要增加应用程序的套接字接收缓冲区或查找会导致> MTU数据包在接收时丢弃的Windows UDP网络配置选项 .

相关问题