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分包组包方法的更多相关文章

  1. Socket之UDP分包组包

    一般传输大的文件和信息的时候需要涉及到分包和组包,方法有很多,下面一种是借鉴了别人的思路,供大家参考哈 分包 1.取出需要传输的文件和字符的长度和大小放入缓存区里面: 2.设定固定传输的长度,用需要传 ...

  2. c# UDP分包发送

    考虑到UDP的高速和其他协议的复杂性,做了一个依靠时间发送的分包组包重发的UDP库. https://github.com/jinyuttt/UDPTTL.git

  3. Qt通过UDP传图片,实现自定义分包和组包

    一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...

  4. TCP的组包、半包、粘包与分包

    一.概念 1)组包.简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包. 2)半包.指接受方没有接受到一个完整的包,只接受了部分,这种情况主要 ...

  5. TCP 、UDP、IP包的最大长度

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  6. TCP,UDP,IP数据包的大小限制

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  7. UDP主要丢包原因及具体问题分析

    UDP主要丢包原因及具体问题分析 一.主要丢包原因   1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...

  8. c#有关udp可靠传输(包传输数据包) 升级

    在c#有关udp可靠传输(包传输数据包)我们讨论,UDP包的发送,可是上一个程序有一个问题.就是数据比較大.一个Message类序列化后都有2048B,而实际的数据量也就只是 50B罢了,这就说明当中 ...

  9. Linux下基于命令行的抓包方法

    大家可能都已经对著名的抓包工具Ethereal比较熟悉了,这里再介绍一种基于命令行的抓包工具tcpdump. 举例:抓本机1813端口上的数据,并将抓包结果保存在test.cap文件中 然后在本地可以 ...

随机推荐

  1. C#获取当前站点的根地址

    /// <summary> /// 得到当前网站的根地址 /// </summary> /// <returns></returns> protecte ...

  2. 关于equal和toString方法的实验报告

    一 实验目的 了解equal和toString方法 二 实验软件环境 操作系统:windows xp java version: "1.7.0_51" 开发工具:Eclipse S ...

  3. hibernate 一对多(级联关系)

    hibernate 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hiber ...

  4. 一个可用模板的Xml描述

    <?xml version="1.0" encoding="utf-8"?> <VMTEMPLATE> <ID>48< ...

  5. Process management of windows

    igfxem.exe进程是正常的进程.是intel家的核显驱动类的进程.核显即"核芯显卡",是指GPU部分它是与CPU建立在同一内核芯片上,两者完全融合的芯片."核芯显卡 ...

  6. hdu1269 Tarjan强连通分量 模板(转)

    #include<stdio.h> #include<iostream> #include<vector> using namespace std; ; vecto ...

  7. Sqlserver中的几把锁和.net中的事务级别

    当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOCK(不加锁 ...

  8. 基于IKAnalyzer搭建分词服务

    背景 前端高亮需要分词服务,nlp团队提供的分词服务需要跨域调用,而且后台数据索引使用的IK分词.综合评价,前端分词也需要基于IK分词器. IKAnalyzer服务已经停止更新,且对Lucene支持仅 ...

  9. mxnet 线性模型

    mxnet 线性模型 li {list-style-type:decimal;}ol.wiz-list-level2 > li {list-style-type:lower-latin;}ol. ...

  10. java实现链式队列

    java实现链式队列...比较简单 package datastruct; public class QueueLink implements Queue { // 定义一个节点内部类 class N ...