C# UDP通信 操作大数据时 减少丢包的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# UDP通信 操作大数据时 减少丢包的方法相关的知识,希望对你有一定的参考价值。

Socket udpServer;
IPEndPoint serverIP=new IPEndPoint(IPAddress.Parse(xxx.xx.x.xxx),9199);
udpServer.Bind(serverIP);
EndPoint.Remote=(EndPoint)serverIP

new Thread(()=>

while(true)

byte[] data=new byte[102400];定义一个数据缓存区
try

length=udpServer.ReceiveFrom(data, ref Remote); 从远端接收到的数据长度
if(length<=0)
break;

string str1=Encoding.GetEncoding("GBK").GetString(data,0,length);将接收到数据转换为字符串

Invoke(new ThreadStart(delegate()

this.textBox1.ApprendText(str1+Environment.NewLine);将字符串显示到文本框中
this.textBox1.ScollToCaret();
))

catch(Exception e)

MessageBox.Show(e.Message);




).Start();

以上是自己写的一段UDP接收的程序,开启一个线程进行数据接收,当数据量小时,没有丢包现象,但是当数据量大时,会出现丢包,请各位帮忙想想办法 !谢谢了

参考技术A 包多的时候,要能保证接收端在收到数据后能立刻再次回到监听状态,以防在处理这个包的消息的时候有新的包发过来却因为接收端还未回到监听状态而造成丢包。研究一下委托回调吧。

另一个是要注意每个包不要携带过长的数据量,可以拆分成若干小包后在每个包头前编号,接收端在收到后排序整理,发现哪个编号丢了返还给发送端要求冲发该吧。研究下消息队列吧。

UDP丢包率可能会增加?

【中文标题】UDP丢包率可能会增加?【英文标题】:UDP packet loss rate might increase on conditions? 【发布时间】:2015-11-03 18:43:01 【问题描述】:

考虑到数据包的大小,UDP 数据包丢失百分比是否会增加?例如,如果我发送 100'000 个数据包,首先尝试 byte[] 大小为 30,但第二次尝试为 300。数据包大小是否会影响它的 丢弃能力,或者数据包丢失百分比与其大小无关?

【问题讨论】:

【参考方案1】:

数据包丢失取决于数据包的大小。这有几个原因。

IP 数据包大约可以达到 64k,但它们会被分段到以太网的 MTU,如果其中一个数据包丢失,则整个 IP 数据包都会被丢弃。对于较大的数据包,如果流量较高,则丢弃较大数据包的概率较高。 MTU 约为 1500 字节。

不仅如此。在内部,协议栈是使用比 mtu 小很多的内部缓冲区实现的,这可以从 300 字节和更大的字节变化。但关键是这些缓冲区也是有限的资源。如果网络设备的缓冲区用完,那么数据包也会被丢弃。

【讨论】:

谢谢你的回答,有趣的东西,当然不知道MTU【参考方案2】:

如果您根据下面的链接不知道相关网络上的 MTU,那么 512 字节的 UDP 有效负载被认为是合理的,可以为您可能没有预料到的其他标头信息留出余量。

What is the largest Safe UDP Packet Size on the Internet

【讨论】:

【参考方案3】:

因为您要发送更大的数据包,是的,它可能会增加数据包被丢弃的机会。

现在,如果您比较发送 100000 个 30 字节的数据包或 10000 个 300 字节的数据包,即使用户数据相同,由于标头的原因,数据包的总大小更大。

【讨论】:

以上是关于C# UDP通信 操作大数据时 减少丢包的方法的主要内容,如果未能解决你的问题,请参考以下文章

PDO操作大数据对象

Linux UDP丢包的原因

浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

UDP 丢包的艺术

LWIP UDP偶发丢包问题

UDP丢包率可能会增加?