Udp分包过程(C#)

来源:互联网 发布:武汉理工大网络 编辑:程序博客网 时间:2024/05/18 21:43

Send与SendTo以及Receive与Receivefrom之间的区别?

一般情况下:

Send、Receive用于TCP

SendTo、Receivefrom用于UDP


Udp发送超大文件一般采用分包发送的方式

Udp分包数据量的上限:  65k
                 
  

   #region 分包处理        public static ICollection<UdpPacket> Split( byte[] datagram, int chunkLength)        {                 string FILE = "First";//第一个分包的标识            string Mid= "Mid";    //后续分包  的标识            if (datagram == null)                throw new ArgumentNullException("datagram");            //存储所有的数据包            List<UdpPacket> packets = new List<UdpPacket>();            //完整的UDP数据包            int chunks = datagram.Length / chunkLength;            //最后一个不完整的数据包的数据量            int remainder = datagram.Length % chunkLength;            //判断最后一个数据包,计算总的数据包            int total = chunks;            if (remainder > 0) total++;
           //进行分包,区别对待第一个包和后续包
            //遍历所有的完整的UDP数据包                       for (int i = 1; i <= chunks; i++)                {                 byte[] chunk=new byte[chunkLength];                Buffer.BlockCopy(datagram,(i-1)*chunkLength,chunk,0,chunkLength);
                //第一个分包                if (i == 1)                {                    packets.Add(new UdpPacket(FILE,total, i, chunk, chunkLength, remainder));                }
               //后续分包标识                    else                    packets.Add(new UdpPacket(Mid, total, i, chunk, chunkLength, remainder));                }
            //最后一个分包                if (remainder > 0)                {                                                       if (total != 1)                    {                        int length = datagram.Length - (chunkLength * chunks);                        byte[] chunk = new byte[length];                        Buffer.BlockCopy(datagram, chunks * chunkLength, chunk, 0, length);                        packets.Add(new UdpPacket(Mid, total, total, chunk, chunkLength, remainder));                    }                    else                    {                        int length = datagram.Length - (chunkLength * chunks);                        byte[] chunk = new byte[length];                        Buffer.BlockCopy(datagram, 0, chunk, 0, length);                        packets.Add(new UdpPacket(FILE, total, total, chunk, chunkLength, remainder));                                           }                                   }                                 return packets;        }         #endregion


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为6x手机电源键失灵怎么办 华为手机更换主题后图标不变怎么办 手机屏幕上的拨打电话键没了怎么办 小米手机电用完了充不进去怎么办 华为微信分身版本过低怎么办 手机连接不上4g网络怎么办办 手机通话时老返回锁屏怎么办 小米手机指纹解锁按键不灵了怎么办 小米手机4s黑屏开不了机怎么办 手机老年机突然黑屏开不了机怎么办 苹果7P遮挡传感器就黑屏怎么办 手机被偷支付宝的钱被偷怎么办 oppo手机微信视频黑屏了怎么办 小米账号锁死插卡不显示卡怎么办 红米手机充电时不黑屏怎么办 酷派手机开机出现系统错误怎么办 乐视1s手机开不了机怎么办 酷派手机的信息文件夹不见了怎么办 酷派手机开机卡在开机界面怎么办 魅蓝拨号键老是闪退怎么办 手机上浏览器搜索时字在右边怎么办 酷比魔方平板开不开机怎么办 红米手机摔了有一角黑屏了怎么办 红米手机刷机黑屏打不开怎么办 魅蓝x一打电话就黑屏怎么办 红米手机黑屏打不开怎么办充电发烫 小米手机打电话来是关机的怎么办 红米手机打电话自动灭屏怎么办 红米5s手机白屏怎么办 红米手机黑屏开不了机怎么办 红米note开机键不灵了怎么办 红米2忘记锁屏密码怎么办 红米1手机忘记锁屏密码怎么办 红米4x关不了机怎么办 红米4a手机屏幕黑屏打不开怎么办 红米手机为什么开不了机怎么办 红米note手机刷机失败怎么办 金立手机来电屏幕不亮怎么办 小米5s桌面相机图标不见了怎么办 小米手机锁屏密码忘了怎么办? 小米平板电脑锁屏密码忘了怎么办