Socket之UDP分包组包

  一般传输大的文件和信息的时候需要涉及到分包和组包,方法有很多,下面一种是借鉴了别人的思路,供大家参考哈

分包

  1、取出需要传输的文件和字符的长度和大小放入缓存区里面;

  2、设定固定传输的长度,用需要传输的长度除以固定传输的长度都可以得到需要传输的次数;

  3、传输一次字节流中包括(文件名字、文件名字大小、顺序、数据总块数、数据长度、数据总长度)

  4、包组装完成后,都剩下发送;当确定到接收方收到后,在传下一次包;


FileStream m = new FileStream(FullName, FileMode.Open, FileAccess.Read); //FullName得到文件完整路径
Byte[] BTmp = new byte[m.Length];
m.Read(BTmp, 0, Convert.ToInt32(m.Length));
m.Close();
string fileName = dirs[j].FullName.Replace("\\", "/");
while (fileName.IndexOf("/") > -1)
{
fileName = fileName.Substring(fileName.IndexOf("/") + 1);
}
byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

int m_intMessageLength = BTmp.Length;
int m_intSerial = 0;
int m_intBlocks = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(m_intMessageLength) / Convert.ToDouble(m_intBlockLength))); //数据分割块数
int m_intlastlength = 0;
//求出最后一块数据长度
if (m_intMessageLength % m_intBlockLength == 0)
m_intlastlength = m_intBlockLength;
else
m_intlastlength = m_intMessageLength - (m_intBlocks - 1) * m_intBlockLength;

while (m_intSerial < m_intBlocks)
{
try
{
int m_intLength = 0; //数据长度
if ((m_intSerial + 1) == m_intBlocks)
m_intLength = m_intlastlength;
else
m_intLength = m_intBlockLength;

byte[] data = new byte[m_intLength + 20 + fileNameByte.Length];
int place = 0;
Buffer.BlockCopy(BitConverter.GetBytes(m_intSerial), 0, data, place, 4); //顺序戳
place += 4;
Buffer.BlockCopy(BitConverter.GetBytes(m_intBlocks), 0, data, place, 4); //数据总块数
place += 4;
Buffer.BlockCopy(BitConverter.GetBytes(m_intLength), 0, data, place, 4); //数据长度
place += 4;
Buffer.BlockCopy(BitConverter.GetBytes(BTmp.Length), 0, data, place, 4); //数据总长度
place += 4;
////////////////
Buffer.BlockCopy(fileNameLen, 0, data, place, 4); //文件名长度
place += 4;
Buffer.BlockCopy(fileNameByte, 0, data, place, fileNameByte.Length); //文件名大小
place += fileNameByte.Length;
Array.Copy(BTmp, m_intSerial * 1000, data, place, m_intLength); //复制数据
sersoc.SendTo(data, 0, data.Length, SocketFlags.None, Remot);
bool result = sersoc.Poll(1000000, SelectMode.SelectRead);
if (result)
{
byte[] linshi = new byte[1024];
int recv = sersoc.ReceiveFrom(linshi, ref Remot);
int biaoji = BitConverter.ToInt32(linshi, 0);
int i = BitConverter.ToInt32(linshi, 4);//i值为111时表示接到客户端的确认
if (biaoji == 999) m_intSerial = i;
if (i == 0) break;
}

} //endtry
catch (System.Exception pe)
{
Console.WriteLine(pe.ToString());
}

组包


  1、收到包后,取出数据总长度和文件名字;

  2、根据顺序写入字节流中,还原成原始包;


 int m_intSerial = 0;
int m_intBlocks = 0; //数据分割块数
int m_intLength = 0; //数据长度
int m_intMessageLength = 0;
int place = 0;
int recv;
int biaoji = 999;
place = 0;
m_intSerial = BitConverter.ToInt32(bytesF, place);//顺序戳
place += 4;
m_intBlocks = BitConverter.ToInt32(bytesF, place);//数据总块数
place += 4;
m_intLength = BitConverter.ToInt32(bytesF, place);//数据长度
place += 4;
m_intMessageLength = BitConverter.ToInt32(bytesF, place);//数据总长度
place += 4;
int count = BitConverter.ToInt32(bytesF, place);//文件名长度
place += 4;
string fileName = Encoding.UTF8.GetString(bytesF, place, count);//文件名
place += count;
if (m_intSerial == 0)
{ m_intGetCount = 0; data = new byte[m_intMessageLength]; } //申明数据的总长

Array.Copy(bytesF, place, data, m_intBlockLength * m_intSerial, m_intLength); //复制数据

Socket之UDP分包组包

时间: 2024-10-13 11:30:15

Socket之UDP分包组包的相关文章

蓝牙收发数据过大需要分包-组包处理

{ static unsigned char Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status; //意思是一个iAP数据包被一个Bt_RxData发送 if(Bt_RxData_Merge_Status==Bt_RxData_Merge_Defaul_Status && 0x55==Bt_RxData->MsgData[2]) { //首先检测iAP数据包的长度 //iAP数据包:Length域数据包含1或3字节,这取决于载荷

异步SOCKET分包和组包的一种通用算法

异步SOCKET分包和组包的一种算法 unit uFun;// 应用协议// cxg 2016-9-23 interface uses SysUtils, Classes, PeachCtrl.Net.IocpTcpServer, System.Generics.Collections ; const // 包长 pack_len = 8192; const // 命令分类 cmd_qry_req = 1; cmd_qry_res = 2; cmd_post_req = 3; cmd_post_

Qt Socket 收发图片——图像拆包、组包、粘包处理

之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次和大家分享一个对大的图片拆包.组包.处理粘包的例子. 程序平台:ubuntu . Qt 5.5.1 为了对接收到的图像字节进行组包,我们需要对每包数据规定协议,协议如下图: 每包数据前10个字节对应含义如下:前两个字节对应数据包类型,中间四字节预留,最后四字节是包内数据实际长度.对应协议图片更方便刚

TCP 组包和拆包算法

/************************************* 文件名: server.c TCP 组包和拆包实现算法 作者: 马中海 QQ: 284358503 Email: [email protected] */ #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h>

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API). 通过Socket,我们才能使用TCP/IP协议.实际上,Socket跟TCP/IP协议没有必然的联系.Socket编程接口在设计的时候,就希望也能适应其他的网络协议.所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,

基于Socket的UDP和TCP编程介绍

一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(streamsocket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手)         1.客户端发

【Windows socket+IP+UDP+TCP】

Windows Socket+网络 Winsock是 Windows下套接字标准.          Winsock 编程分为UDP[Windows socket + UDP],TCP[Windows socket + TCP]编程.Windows socket 建立在网络基础之上,UDP编程采用用户数据报协议(User Datagram Protocol ,UDP),TCP编程采用传输控制协议(Transmission Control Protocol,TCP).UDP,TCP不同的特性,适应

基于 Socket 的 UDP 和 TCP 编程介绍

基于 Socket 的 UDP 和 TCP 编程介绍 一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种. UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. 二.TCP和UDP介绍 1)基本TCP客户-服务器程序设计基本

【转】Windows Socket TCP/UDP

Windows Socket编程,发现这篇文章不错,就拿过来分享下,转载地址:http://www.cnblogs.com/fantasy-blog/archive/2013/04/21/3033935.html SOCKET网络编程 (WINDOWS SOCKET) 1.前言 网上看了很多Socket的资料,将理解的知识总结下,详细介绍下VC下windows sockets编程,并结合服务器和客户端的两个实例(TCP/UDP)讲解下. 2.SOCKET相关原理 在网络编程中最常用的方案便是Cl