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

时间:2017-11-08 05:15:07

标签: c# sockets networking udp

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

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

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

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

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

第一次尝试:( 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);
     }
}

第二次尝试:(使用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

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

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

1 个答案:

答案 0 :(得分: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

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