c#Udp分包组包方法
udp通信协议,相信大家都知道这个。由于是无连接的协议,所有udp的传输效率比tcp高。但是udp协议传输较大的数据文件得分包
最近写了个分包组包的方法,拿来和大家分享,如果有什么不妥的地方,欢迎点评
分包的方法

//每个包中二进制数组的长度
public static int Count = ; //分包的方法,传入一个byte数组和包的编号(编号是用来判断收到数据是否是同一个包的)
public static List<UdpPackage> GetList(byte[] bytes, int num)
{
List<UdpPackage> packages = new List<UdpPackage>();//定义一个包集合
int count = ;//用来记录包在包集合中的位置
int nums = bytes.Length / Count;//分包后包集合中包的数量
if (bytes.Length % Count > ) nums++; //循环遍历传入的byte数组,根据每个包中的二进制数组长度(Count)来分割
for (int i = ; i <= bytes.Length; i += Count)
{
count++;//位置++ byte[] bs = new byte[Count];
int all = Count;
//判断最后一个分包是否超过剩余byte数组的长度
//如果超过,则最后一个包的长度为剩余byte数组的长度
if (i + Count > bytes.Length)
all = bytes.Length - i;
//将传入byte数组copy到包中
Buffer.BlockCopy(bytes, i, bs, , all);
packages.Add(new UdpPackage
{
Bytes = bs,
PacketNum = num,
PacketAtNum = count,
PacketCount = nums
});
}
return packages;
}

组包的方法

//组合包方法,传入一个包集合,和包的编号
public static byte[] GetBytes(UdpPackage package,int count)
{
byte[] bytes = null;//接包二进制集合
udps.Add(package);//把传入的包add进包集合中 //linq查询,查出包集合中所有和传入包编号拥有相同编号的包,并根据所在包
//的位置排序
var result = from n in udps where n.PacketNum == count
orderby n.PacketAtNum
select n; //判断查出包的集合是否跟分包时的数量一样
if (result.Count() == package.PacketCount)
{
bytes=new byte[];//初始化接包二进制数组
int jiShu = ;//定义一个计数器 //遍历所有查询结果中的包,把每个包中的二进制数组组合起来
foreach (UdpPackage v in result)
{
//把当前循环中包的二进制集合copy到接包数组中,从jishu*Count开始
v.Bytes.CopyTo(bytes, jiShu * Count);
//计数器++
jiShu++;
} //调用清包方法,清除所有组包完成的包
clear(count); } return bytes;
} //清除方法,根据传入的包编号删除所有包集合中拥有此包编号的包
private static void clear(int index)
{
for (int i = ; i < udps.Count;)
{
//判读包的编号是否已传入的编号相同
//如果相同则删除,否则进入下一个
if (udps[i].PacketNum == index)
udps.Remove(udps[i]);
else
i++;
}
}

包类
[Serializable]
public class UdpPackage
{ public byte[] Bytes { get; set; }//包中的二进制数据
public int PacketNum { get; set; }//所属包集合的编号
public int PacketCount { get; set; }//所属包集合中包的个数
public int PacketAtNum { get; set; }//所属包集合中的第几个包 }
这个用来测试过udp协议写的局域网屏幕监控,测试完全没问题
c#Udp分包组包方法的更多相关文章
- Socket之UDP分包组包
一般传输大的文件和信息的时候需要涉及到分包和组包,方法有很多,下面一种是借鉴了别人的思路,供大家参考哈 分包 1.取出需要传输的文件和字符的长度和大小放入缓存区里面: 2.设定固定传输的长度,用需要传 ...
- c# UDP分包发送
考虑到UDP的高速和其他协议的复杂性,做了一个依靠时间发送的分包组包重发的UDP库. https://github.com/jinyuttt/UDPTTL.git
- Qt通过UDP传图片,实现自定义分包和组包
一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...
- TCP的组包、半包、粘包与分包
一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...
- TCP 、UDP、IP包的最大长度
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
- TCP,UDP,IP数据包的大小限制
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
- UDP主要丢包原因及具体问题分析
UDP主要丢包原因及具体问题分析 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...
- c#有关udp可靠传输(包传输数据包) 升级
在c#有关udp可靠传输(包传输数据包)我们讨论,UDP包的发送,可是上一个程序有一个问题.就是数据比較大.一个Message类序列化后都有2048B,而实际的数据量也就只是 50B罢了,这就说明当中 ...
- Linux下基于命令行的抓包方法
大家可能都已经对著名的抓包工具Ethereal比较熟悉了,这里再介绍一种基于命令行的抓包工具tcpdump. 举例:抓本机1813端口上的数据,并将抓包结果保存在test.cap文件中 然后在本地可以 ...
随机推荐
- 深入剖析SolrCloud(一)
作者:洞庭散人 出处:http://phinecos.cnblogs.com/ 本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由 ...
- 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式
Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...
- 算法描述》关于LIS的nlogn方法
上次TYVJ有一道裸LIS,然而我当时直接打了一个N^2暴力就草草了事,然后就ZZ了,只拿了60分,其实NlogN的LIS和N^2的差的不多,只是没有N^2,好想罢了,鉴于某学弟的要求,所以就重现一下 ...
- selenium2 用testNG对百度首页输入框进行测试 (三)
如果还没有安装testNG的亲,可以点击http://www.cnblogs.com/milanmi/p/4346580.html查看安装过程. 这节主要是对百度首页的输入框进行输入测试. packa ...
- mysql 主键
什么是主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列).而这个承担标识作用的列称为主键. 任何列都可以作为主键,只要它满足以下条件: • 任何两行都不具有相同的主键值.就是说这列的值都是 ...
- Entity Framework 6.0 Tutorials(9):Stored Procedure Mapping
Code First - Insert, Update, Delete Stored Procedure Mapping: Entity Framework 6 Code-First provides ...
- 4.python 系统批量运维管理器之paramiko模块
paramiko paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. paramiko实现ssh2不外乎两个角度:SSH客户端与服务端 SS ...
- POJ - 3984 迷宫问题 BFS求具体路径坐标
迷宫问题 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
- mysql数据库学习小结
数据库的学习可以从以下几个层次了解掌握,这样思路清晰后后面不管怎么变化都可以随时应变: 1.mysql基础知识 2.操作数据库的方法,增 删 改 查 3.jdbc连接数据库,工作原理 难点重点,如:P ...
- 国外物联网平台(7):FogHorn
国外物联网平台(7) ——FogHorn 马智 引言: 据外媒在本月20日报道,硅谷初创公司FogHorn正在与谷歌合作以简化工业物联网应用的部署.本文对FogHorn的技术.产品.应用和生态进行了分 ...