浅析C#UDP传输大文件

1 篇文章 0 订阅
1 篇文章 0 订阅

1、前言

众所周知,UDP通信是允许丢包的,这个通信方式本身就是“不太靠谱的”,针对的是即便数据丢了几包也无所谓的情景,如果你非要用这个传输大文件(如一个视频),我只能说你和我一样执着,明明该用TCP的,非要用UDP这个鬼东西……大概结果就是,你传过去的东西打不开(中间有东西丢了你怎么用?前后顺序都乱了你怎么用?)

2、正题

其实确有用武之地,看网上做远程监控、视频传输、截图传输什么的老兄,都在找方法。一个视频少说也有几兆,一个包肯定发不完(一个UDP包最大就65507Byte,约64KB,具体看https://www.cnblogs.com/lvdongjie/p/4988622.html)。所以,要把它分成一个个小包发送,一般小包大小设置成1KB。到这里,UDP传输问题就转移到如何控制“丢包”上了。

UDP丢包一般是网络较差时发生,如果是网络稳定的局域网(如插在同一个交换机上的两个主机),其实丢包很少出现。最多出现的其实是接收方接收或处理速度不及时,造成接收方还没有处理完这个包,下一个包就发来了,这时候的“丢包”可以看作接收方自己扔掉的,解决方案可以采用两种思路:

第一种是发送方加个线程睡眠(人家跟不上你的速度,你不能慢点发吗?),在发送端线程上加一个Sleep(1)即可,别小看这1ms,在局域网上基本能解决问题;

第二种是接收方加个缓存机制(处理不完先存着,按顺序慢慢来嘛,但别忘了设置缓存峰值,防止炸内存。。)。

但是,如果是在互联网上传输,懂网络的应该知道,先发出去的包并不一定先到(互联网有自己的传包方案,你的包一旦发出来了,就不归你管了,走哪条路得人家互联网来定。这就造成了,有的包虽然先出发,但是路有点堵,却后到了……),所以,这时收到的包可能就是乱序的了,这就麻烦了,所以这时候需要对数据进行分组和编号如下方案:

分包和编号:分包的关键是要有序号标记,也就是要定义清楚,每个包排在整个文件的第几号,发过去的时候,对方要按照顺序组包的,否则以UDP的尿性,就容易乱了套啦,这样就防止了乱序问题。这针对的是单个文件,在单个文件内部编号,假如要发送多个文件呢?对文件也要编号,这时不妨采用GUID获取唯一编号。

分包组包的具体思路见如下文章,这里不赘述,等后面有时间我再把我的代码贴出来:

http://www.cr173.com/html/19884_1.html

https://www.cnblogs.com/MRRAOBX/articles/3402721.html

https://www.cnblogs.com/caoxianbing/articles/3462504.html

3、后记

到这里之后细想,好像还是哪里不对……是的,万一你发的包不是晚到,而是不到呢?万一在路上经过某个交换机时,那个交换机突然断电了呢?这个包就彻底没有了!你组包出来的文件还是少东西啊!还是不能用啊!

如果到这里你还执着于用UDP发送的话,不妨去了解下TCP的原理,或许你会跟我一样,豁然开朗…………

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值