gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:03:47 26 4
gpt4 key购买 nike

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

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

在 PC 上,我有一个 C# 程序,它尝试接收数据包并对其进行解码。 UDP 接收器在有效载荷低于 1500 字节时可以很好地接收数据包,但它不能接收碎片数据包。

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

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

第一次尝试:(使用 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:
我在 Loopback(127.0.0.1) 中测试了这个场景,我可以很好地接收到 4k UDP 消息。

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

最佳答案

我会确保这些消息实际上被传递到您的进程的 UDP 接收队列。您可能会看到它是 Wireshark,但这并不能保证它以后不会在 UDP 协议(protocol)级别被丢弃或过滤。

我会打开一个命令窗口 (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

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

关于c#,socket无法接收分片的UDP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47172041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com