网络编程里的组包问题(粘包)求组。
以ClientSocket SendBuf模式发送和接收数据,发送结构体,接收的时候也读入结构体,这样封包比较清晰
定义包结构体
typedef struct PKHead
{
DWORD PackId; //包类型
DWORD PackDateLen; //包数据长度
//包实际数据
}PKHead;
typedef struct Pack
{
PKHead pHead;
char *pDate; // 传送的数据
}Pack;
char m_pBuff[1024]; //定义接收包缓存
int m_Pbuffsz=sizeof(m_pBuff); //数组定义长度
int m_Pbuffst=StrLen(m_pBuff); //数组实际内容长度
/*****************************************************************************
服务端发送一个包过来首先判断是否缓存能够装下?装的下装入,装不下扩充缓存。
但是存在一些问题。比如我发送结构体过来的时候可能是1234\0\0\0 但是扩充代码会造成\0\0消失,当我用结构体去读入数据的时候就乱了。
Description:添加数据到缓存的函数
Input:pBuff[in]-待添加的数据;nLen[in]-待添加数据长度
******************************************************************************/
BOOL __fastcall TForm1::AddBuff( char *pBuff, int nLen )
{
if ( nLen <= m_Pbuffsz-m_Pbuffst)///判断剩余空间是否足够存放nLen长的数据,这个地方就有问题假设缓存里已经存在123\0\0456这个数据,通过strlen方式那么只得到长度为3;而实际长度是8,因为遇见了\0;
{
StrCat(m_pBuff, pBuff );
m_Pbuffst += nLen;
}
else///若不够则扩充原有的空间
{
char *p = m_pBuff ;//每次增长2*nLen //这里也是本来是123\0\0\0的话 p就只有123了
char * m_pBuff = new char[m_Pbuffsz];
memcpy(m_pBuff,p,m_Pbuffst);
delete []p;
StrCat(m_pBuff , pBuff);
m_Pbuffst += nLen;
//m_cs.Unlock();
return TRUE;
}
//m_cs.Unlock();
return TRUE;
}
以上代码存在很多问题,只是一个思路。请各位高手能给个代码学习下。原理我也知道。参考了网上有人写的代码也有问题比如http://www.cnblogs.com/yjmyzz/archive/2009/12/01/1614326.html 不知如何能满足我结构体整体的发送和接收,处理定长时候数据位不满\0问题
本人初学socket编程。还望大家多指导啊,最好能给出详细的代码针对组包和读取 谢谢啊。端午快乐