link_struct* CGMToolDlg::ParsePacketOneLink(link_struct* pLinkHead)
{
if(pLinkHead == NULL)
return NULL;
int nRecv = 0;
bool bIsParse = false;
link_struct* pNewNode = NULL;
link_struct* pHead = NULL;
link_struct* pEnd = NULL;
link_struct* pLinkBackup = pLinkHead;
int nOffset = 0;
char buf[8] = {0};
memcpy(buf,pLinkHead->RecvBuf,8);
int pblen = *(int*)(buf+4);
char pBuffer[MAX_PACKET_SIZE] = {0};
while(pLinkHead)
{
pNewNode = (link_struct*)malloc(sizeof(link_struct));
if(pNewNode == NULL)
{
MessageBox("内存空间分配失败","提示");
ReleaseLinkMemory(pHead);
ReleaseLinkMemory(pNewNode );
Return NULL;
}
if(nOffset>0)
memcpy(pBuffer + sizeof(pLinkHead->RecvBuf) - nOffset,pLinkHead->RecvBuf,nOffset); //当前结点的上半截,即是缓冲区下半截
else
memcpy(pBuffer,pLinkHead->RecvBuf,sizeof(pBuffer));
memcpy(pNewNode->RecvBuf,pBuffer,sizeof(pNewNode->RecvBuf));
if(pHead == NULL)
pHead = pNewNode;
else
pEnd->next = pNewNode;
pEnd = pNewNode;
nRecv+=sizeof(pLinkHead->RecvBuf);
pEnd->next = NULL;
if((pblen+sizeof(CLIENT_PACKET)<=nRecv) //如果读取完全
{
int err = CClientPacket::ParsePacket(this,pHead);
if(err == ERR_CONN_CLOSED || err == ERR_FATAL)
{
return NULL;
}
if(pLinkHead->next!=NULL)
{
nOffset = sizeof(pLinkHead->RecvBuf)-(nRecv-(pblen+sizeof(CLIENT_PACKET)));
memcpy(pBuffer,pLinkHead->RecvBuf) + nOffset,sizeof(pLinkHead->RecvBuf)-nOffset); //当前结点的下半截,即是缓冲区上半截
}
else
nOffset = 0;
pHead = NULL;
pEnd = NULL;
nRecv = 0;
ZeroMemory(pBuffer,sizeof(pBuffer));
bIsParse = true;
ZeroMemory(buf,sizeof(buf));
}
if(bIsParse)
{
memcpy(pBuffer,pLinkHead->RecvBuf) + nOffset,sizeof(pLinkHead->RecvBuf)-nOffset);
if(pNewNode->next == NULL)
{
pNewNode = (link_struct*)malloc(sizeof(link_struct));
if(pNewNode == NULL)
{
MessageBox("内存空间分配失败","提示");
ReleaseLinkMemory(pHead);
ReleaseLinkMemory(pNewNode );
Return NULL;
}
memcpy(pNewNode->RecvBuf,pBuffer,sizeof(pNewNode->RecvBuf));
if(pHead == NULL)
pHead = pNewNode;
else
pEnd->next = pNewNode;
pEnd = pNewNode;
}
}
pLinkHead = pLinkHead->next;
}
ReleaseLinkMemory(pLinkBackup);
return pHead;
}