一般编程只关心上层的东西,你指的是SOCKET编程吧,封包其实就是数据,格式是自定义的,能给出关键代码么。
///<summary>
/// 发送数据封装
///</summary>
///<param name="data">需要发送的数据</param>
///<returns>封装后的数据</returns>
public static byte[] SendDataPackage(byte[] data)
{
string Head = "httptyy://";//数据头
string End = "//:tyyend";//数据尾
int len = data.Length;
len += 23;
byte[] DataHead = Encoding.ASCII.GetBytes(Head);//头部数据
byte[] DataCount = new byte[4];//四个字节的数据长度
DataCount = BitConverter.GetBytes(data.Length);//数据长度
byte[] DataEnd = Encoding.ASCII.GetBytes(End);//数据尾部
//定义结果字节
byte[] DataResult = new byte[len];
//封装数据
for (int i = 0; i < DataHead.Length; i++)//数据头值复制
{
DataResult[i] = DataHead[i];//逐个复制
}
for (int i = 0; i < DataCount.Length; i++)
{
DataResult[i] = DataCount[i];//逐个复制
}
for (int i = 0; i < data.Length; i++)//数据区复制
{
DataResult[i] = data[i];//逐个复制
}
for (int i = 0; i < DataEnd.Length; i++)//数据结尾验证码
{
DataResult[i] = DataEnd[i];//逐个复制
}
//加密数据
DataResult = DataEncryption(DataResult);
//返回
return DataResult;
}
///<summary>
/// 搜索数据头返回数据头索引值
/// 去除数据报头,去除后去除数据长度解包
///</summary>
///<param name="data">收到的数据</param>
///<returns></returns>
public int Seachbyte(byte[] data)
{
int i = 0;
string str = "httptyy://";//数据头
byte[] DataHead = Encoding.ASCII.GetBytes(str);//字节型数据头
for (int j = 0; i < data.Length; j++)
{
if (data[j] == DataHead[0])
{
for (int s = 1; s < 10; s++)
{
if (data[s + j] != DataHead[s])
{
continue;
}
i = j;
}
}
}
return i;
}
本来想像上面那样封包,下面去掉报头,然后再取4位计算数据长度,然后再取长度的,但是好像有问题,请指点
@天下狙击:
for (int i = 0; i < DataHead.Length; i++)//数据头值复制
{
DataResult[i] = DataHead[i];//逐个复制
}
for (int i = 0; i < DataCount.Length; i++)
{
DataResult[i] = DataCount[i];//逐个复制
}
for (int i = 0; i < data.Length; i++)//数据区复制
{
DataResult[i] = data[i];//逐个复制
}
for (int i = 0; i < DataEnd.Length; i++)//数据结尾验证码
{
DataResult[i] = DataEnd[i];//逐个复制
}
仔细研究这个代码...
@大烧饼的实验室: 明白了,都给赋值到第一个位置去了
但是如果我接收的时候不辛接收到了下一条的数据怎么处理,是不是定义一个不可能的长度,例如,我发送100000字节的东西,不够的地方直接补一串0
@天下狙击:
你是用一个线程发送一个线程接收? 如果是在一个线程里面是不会出现这个问题的。如果是socket异步的话你每次接收后设置一个flag = 1,解密完后在if flag = 0后再接收下一条即可
@大烧饼的实验室: 明白了,谢谢
@天下狙击:如果有问题可以继续追问的没关系,也是当学习