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. oracle一个创建用户、创建表空间、授权、建表的完整过程

    1.首先我们可以用scott用户以sysdba的身份登录oracle. conn scott/tiger as sysdba 2.然后我就可以来创建用户了. create user zzg ident ...

  2. java Web servlet简介及其生命周期

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 我们可 ...

  3. java基础之JDBC三:简单工具类的提取及应用

    简单工具类: public class JDBCSimpleUtils { /** * 私有构造方法 */ private JDBCSimpleUtils() { } /** * 驱动 */ publ ...

  4. IWebBrowser和IE浏览器的行为不一样

    原本一直以为IWebBrowser2的行为和IE浏览器的行为应该是一样的,但是最近发现事实不是如此. IE8以后的浏览器都带有兼容模式,而IWebBrowser2默认情况下是在兼容模式下运行的,可以参 ...

  5. Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制

    1 Stream Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...

  6. 690. Employee Importance员工权限重要性

    [抄题]: You are given a data structure of employee information, which includes the employee's unique i ...

  7. 459. Repeated Substring Pattern 判断数组是否由重复单元构成

    [抄题]: Given a non-empty string check if it can be constructed by taking a substring of it and append ...

  8. boost 时间与日期处理

    博客转载自: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确, ...

  9. jqentitymanage

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflect ...

  10. 关于IIS配置SimpleHandlerFactory-Integrated在其模块列表中有一个错误模块ManagedPipelineHandler的错误处理

    解决方法: 使用管理员运行aspnet_regiis.exe 命令:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i v ...