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