18,357
社区成员
发帖
与我相关
我的任务
分享
struct myWSAPack //标准数据包结构
{
int WSALen; //数据包长度
int WSAId; //数据包ID
char Buffer[MYWSA_BUFSIZE]; //数据包内容
};
int myWSAClient::UnPack(char *Buffer, int Lenth)
{
if (Lenth <= 0 || NULL == Buffer)
{
return -1;
}
int Len = Lenth;
char *lpHead = Buffer;
myWSAPack *lpPack = (myWSAPack*)lpHead;
while (Len > 0)
{
if (lpPack->WSALen <= 0 || lpPack->WSALen > MYWSA_PACKSIZE)
{
sprintf_s(m_Log, sizeof(m_Log), "拆包出错:WSALen=%d", lpPack->WSALen);
Log(m_Log);
return -1;
}
if (Len < lpPack->WSALen)
{
sprintf_s(m_Log, sizeof(m_Log), "拆包出错:len=%d != lPHead->WSALen=%d", Len, lpPack->WSALen);
Log(m_Log);
return -1;
}
myWSACDATA data = {0};
data.Lenth = lpPack->WSALen;
memcpy(data.Buffer, lpPack, lpPack->WSALen);
Len -= lpPack->WSALen;
lpHead = lpHead + lpPack->WSALen;
lpPack = (myWSAPack*)lpHead;
myWSAPack *Pack = (myWSAPack*)data.Buffer;
switch (Pack->WSAId)
{
case MYWSA_HEARTID:
{
myWSAPack rPack = {0};
rPack.WSAId = MYWSA_HEARTRD;
rPack.WSALen = MYWSA_HEADSIZE;
::send(m_sConnect, (char*)&rPack, rPack.WSALen, 0);
}
break;
case MYWSA_HEARTRD:
{
if (true == m_IsHearting)
{
for (int i = 0; i < MYWSA_HEARTLIMIT; ++ i)
{
if (0 == m_HeartCount[i])
{
m_HeartCount[i] = 1; //写入心跳记录
break;
}
}
}
}
break;
default:
{
m_ReceiveQue.push(data);
::PostMessage(m_MainHandle, m_MSGID, m_WPID, MYWSA_CRECEIVE);
}
}
}
return 1;
}