struct HEADER
{
char szMark[11];
DWORD uSSRC;
ULONGLONG useqId;
DWORD utotalPacketSize;
DWORD unowPacketSize;
HEADER()
{
strcpy(szMark, "_My_Header_");
uSSRC = 11001;
useqId = 0;
utotalPacketSize = 0;
unowPacketSize = 0;
}
};
BYTE *m_szBuffer;
unsigned long m_uTotle;
unsigned long m_uCur;
int PushData(BYTE* pData, int dataLen)
{
BYTE* szBegin = pData;
BYTE* szEnd = pData + dataLen;
while (szBegin < szEnd)
{
if (m_uTotle == 0)
{
if ((szEnd - szBegin) < sizeof(PACKE_HEADER))
{
return FALSE;
}
char *p = strstr((char*)szBegin, PGS_HEADER_STR);
if (!p)
{
szBegin += 1;
continue;
}
PACKE_HEADER* pCommHeader = (PACKE_HEADER*)szBegin;
if (pCommHeader->uSSRC != PACKET_SSRC)
{
return FALSE;
}
m_uCur = 0;
m_uTotle = pCommHeader->utotalPacketSize;
SAFE_DELETE_ARRAY(m_szBuffer);
m_szBuffer = new BYTE[m_uTotle];
memset(m_szBuffer, 0, m_uTotle);
szBegin += sizeof(PACKE_HEADER);
}
if (m_uTotle > 0)
{
if (m_uCur + (szEnd - szBegin) > m_uTotle)
{
unsigned long rlen = m_uCur + (szEnd - szBegin) - m_uTotle;
unsigned long llen = (szEnd - szBegin) - rlen;
memcpy(m_szBuffer + m_uCur, szBegin, llen);
m_pSink->OnRecvData((HANDLE)fromAddr, m_szBuffer, m_uTotle);
szBegin += llen;
m_uTotle = 0;
}
else if (m_uCur + (szEnd - szBegin) == m_uTotle)
{
memcpy(m_szBuffer + m_uCur, szBegin, (szEnd - szBegin));
m_pSink->OnRecvData((HANDLE)fromAddr, m_szBuffer, m_uTotle);
szBegin = szEnd;
m_uTotle = 0;
}
else
{
memcpy(m_szBuffer + m_uCur, szBegin, (szEnd - szBegin));
m_uCur += (szEnd - szBegin);
szBegin = szEnd;
}
}
else
{
break;
}
}
}