当前位置:  开发笔记 > 编程语言 > 正文

如何使用C#UdpClient发送大数据?

如何解决《如何使用C#UdpClient发送大数据?》经验,为你挑选了1个好方法。

我正在尝试使用C#UdpClient发送大量数据(超过50 MB).

所以首先我将数据分成65507个字节块并循环发送.

for(int i = 0; i < packetCount; i++)
   myUdpClient.Send(blocks[i], block[i].Length, remoteEndPoint);

我的问题是只能收到第一个数据包.在发送第一个数据包期间,网络负载迅速增加到100%,然后无法接收其他数据包.

我希望获得尽可能多的数据吞吐量.

对不起我的英语!感谢您的帮助.



1> 小智..:

对于所有那些说使用TCP的人来说都是愚蠢的错误.虽然TCP是可靠的,并且内核维护的窗口是相当"设置并忘记"的协议,但是当涉及到想要使用其100%吞吐量的人时,TCP将不会这样做(它节流太大,等待由于RTT,ACK会自动将至少50%的流量丢失.

对于原始问题,您在for循环中不间断地发送UDP数据包,窗口填满,然后立即丢弃任何新数据,甚至不尝试上线.您还将数据拆分得太大了.我建议你建立自己的油门机制,每秒开2k段,然后缓慢上升.每个"段"包含SEQ(确认或ACK的序列标识符)和OFF(该数据集的文件内的偏移).在标记数据时,让服务器跟踪这些标记.当另一方获得它们时,它将SEQ号存储在ACK列表中,并且任何缺失的SEQ号被放入NACK计时器列表中,当计时器用完时(如果它们尚未被接收)它将移动到NACK列表.接收器应每隔几秒左右在一次传输中从ACK列表发送5个左右的ACK以及最多5个NACK.如果发送方收到这些消息并且有任何NACK,它应该立即减速并重新发送丢失的片段,然后再继续.确认的数据可以从内存中释放.

祝好运!

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有