首页 新闻 会员 周边 捐助

TCP网络编程封包解包问题

0
悬赏园豆:30 [已解决问题] 解决于 2012-01-23 13:56

用socket+TCP协议编程存在读取数据100字节但是,数据不足100字节的问题,转换数据总是有问题,看了一些书籍,都说发送前封包,接收的时候解包为对象,但是没有例子不是很直观,到底在发送前怎么封装,接收时怎么解封,如果我读取100条数据,前50是我要的,后50是下一条的,那么又要怎么处理呢?请各位指教,谢谢,最好有实例

蜗牛狙击手的主页 蜗牛狙击手 | 初学一级 | 园豆:88
提问于:2012-01-23 12:41
< >
分享
最佳答案
0

一般编程只关心上层的东西,你指的是SOCKET编程吧,封包其实就是数据,格式是自定义的,能给出关键代码么。

收获园豆:30
大烧饼的实验室 | 菜鸟二级 |园豆:265 | 2012-01-23 12:47
封包方法
 ///<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位计算数据长度,然后再取长度的,但是好像有问题,请指点

蜗牛狙击手 | 园豆:88 (初学一级) | 2012-01-23 13:02

@天下狙击: 

    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];//逐个复制
}
仔细研究这个代码...
大烧饼的实验室 | 园豆:265 (菜鸟二级) | 2012-01-23 13:14

@大烧饼的实验室: 明白了,都给赋值到第一个位置去了

但是如果我接收的时候不辛接收到了下一条的数据怎么处理,是不是定义一个不可能的长度,例如,我发送100000字节的东西,不够的地方直接补一串0

蜗牛狙击手 | 园豆:88 (初学一级) | 2012-01-23 13:24

@天下狙击:

你是用一个线程发送一个线程接收? 如果是在一个线程里面是不会出现这个问题的。如果是socket异步的话你每次接收后设置一个flag = 1,解密完后在if flag = 0后再接收下一条即可

大烧饼的实验室 | 园豆:265 (菜鸟二级) | 2012-01-23 13:32

@大烧饼的实验室: 明白了,谢谢

蜗牛狙击手 | 园豆:88 (初学一级) | 2012-01-23 13:56

@天下狙击:如果有问题可以继续追问的没关系,也是当学习

大烧饼的实验室 | 园豆:265 (菜鸟二级) | 2012-01-23 14:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册