我使用了完成端口的方式做的服务器.写了一个算法来解析这一些发过来的数据.
思想是这样的.
先初始化我使用的缓冲区.让缓冲区使用=0个字节.
1.接收到数据包之后,我想看缓冲区是否有断的数据包.
2.有的话将先到的数据接在旧的数据包后面.
3.开始检查这一块内存块.
4.先检查这个数据包头是否合法,是否完整.
5.然后看数据包头里写的数据包的大小加上offset是否超过缓冲区的大小.
6.读出数据包.
7.移动offset
8.是否检查完了.没有完成goto:4.
9.检查退出的时候是否在缓冲区里有断的包.有就保存下来.源代码是这样的.
// 拆解包二.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"char buf_[1024];
int nUseSize_;
#pragma pack(push,1)
struct Head {
int nSize;
};
#pragma pack(pop)
void neagle(char *buff,int nSize);
int _tmain(int argc, _TCHAR* argv[])
{
char buff[10];
Head *pHead=(Head*)buff;
pHead->nSize=sizeof(Head)+3;
char *p=(char*)(pHead+1);
memcpy(p,"111",3);
// 初始化内存块
nUseSize_=0;
Head *pHead2=(Head*)&buff[7];
pHead2->nSize=sizeof(Head)+3;
neagle(buff,pHead->nSize+sizeof(Head)); buff[0]='A';
buff[1]='A';
buff[2]='\0';
neagle(buff,1);
neagle(buff+1,2);
return 0;
}void neagle(char *buff,int size)
{
char *pCheck=0;
int nSize=0;
// 是否需要处理断包
if (nUseSize_==0)
{
pCheck=buff;
nSize=size;
}
// 需要
else
{
memcpy(buf_+nUseSize_,buff,size);
pCheck=buf_;
nSize=nUseSize_+size;
nUseSize_=0;
} //开始查找此内存块
int offset=0;
while (offset!=nSize)
{
// 头长度都没有满
if (nSize-offset<sizeof(Head))
{
break;
}
else
{
// 让头指针指向offset
Head *pHead=(Head*)(&(pCheck[offset]));
if (pHead->nSize<=nSize-offset)
{
// 移动offset
offset+=pHead->nSize;
}
// 没有完整的数据包体
else
{
break;
}
}
} // 如果offset没有查找完,就要保存下来.
if (offset<nSize)
{
memcpy(buf_,pCheck+offset,nSize-offset);
nUseSize_=nSize-offset;
}
}