#define PROTOCOL_HEAD_LEN 2
#define MAX_TCP_WINDOW_LEN 1460
#define MAKE_VALUE_UINT16(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
typedef struct
{
UINT16 usDataLen;
UINT16 usChannelNum;
UINT8 aucData[1];
}PROTOCOL_MSG_STRU;
VOID MsgProc(PROTOCOL_MSG_STRU * pMsg, UINT16 usMsgLen);
UINT8 aucRecvBuf[MAX_TCP_WINDOW_LEN];
UINT8 aucEdgeBuf[MAX_TCP_WINDOW_LEN];
struct socket s;
VOID Func()
{
UINT8 * pTemp = NULL;
UINT16 usDataLen = 0;
UINT16 usMsgLen = 0; // 协议消息长度
UINT32 ulRecvLen = 0; // 接收到的字节数
UINT16 usOffSet = 0; // 偏移量
PROTOCOL_MSG_STRU * pstMsg;
usOffSet = 0;
for(;;)
{
ulRecvLen = _recv(s, aucRecvBuf, MAX_TCP_WINDOW_LEN, 0);
while(usOffSet < ulRecvLen)
{
if (usOffSet < usDataLen)
{
memcpy(pTemp, aucRecvBuf, usDataLen - usOffSet);
pstMsg = (PROTOCOL_MSG_STRU *)aucEdgeBuf;
usMsgLen = (MAKE_VALUE_UINT16(pstMsg->usDataLen) + PROTOCOL_HEAD_LEN)
* sizeof(UINT16);
MsgProc(aucEdgeBuf, usMsgLen);
}
else
{
usDataLen = MAKE_VALUE_UINT16(*(UINT16 *)(aucRecvBuf + usOffSet));
if ((usDataLen + usOffSet) > ulRecvLen)
{
memcpy(aucEdgeBuf, aucRecvBuf + usOffSet, usDataLen + usOffSet -ulRecvLen);
pTemp = aucEdgeBuf + usDataLen + usOffSet -ulRecvLen;
break;
}
else
{
pstMsg = (PROTOCOL_MSG_STRU *)(aucRecvBuf + usOffSet);
usMsgLen = (usDataLen + PROTOCOL_HEAD_LEN) * sizeof(UINT16);
MsgProc(pstMsg, usMsgLen);
usOffSet += usMsgLen;
}
}
}
}
}