TCP 结构体粘包算法

8 篇文章 0 订阅
2 篇文章 0 订阅

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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值