1. 程式人生 > >HPSocket 三種模型PACK,PUSH,PULL

HPSocket 三種模型PACK,PUSH,PULL

更多資訊請參看HP-Socket網路通訊框架開發指南v5.2-20180201(https://download.csdn.net/download/cair2/10636514)
由於TCP是流式套接字,所以socket收到的資料而言,可能不是一個完整的包或者粘包了。此時需要應用層來進行拆包組包了。例如客戶端連續傳送了三個資料包大小分別是:300,500,100。但是接收端接受到的資料可能是200,400,100,200。所以此時我們處理接收到的資料就要進行組包和拆包了。
由於200不足一個數據包,所以需要組合下一個資料包400。此時資料大小為600,但是客戶端第一個傳送的資料包是300,所以此時需要將600拆分為300+300。此時就可以得到第一個資料包300,剩餘資料300,但是第二個資料包是500。資料不夠所以需要組合下一個資料100總共資料400,依然不夠一個包,繼續組包剩餘的200,此時接受資料600,足夠一個數據包500,所以將600拆解為500+100。得到第二個資料包500,剩餘資料100,正好和第三個資料包100匹配。此時資料包解析完畢。基本邏輯

while(true)
{
    data_size = recv_data();
    if(data_size < 資料包長度)
        continue;//繼續接受資料

    ///迴圈拆包,當不夠一個包的時候繼續接受資料等待一個完整的包
    while(true)
    {
        //足夠包長度,拆包
        data_size -= 資料包長度;
        //更新資料緩衝區,處理包
        hanle_pack(pack);
        if(data_size < 資料包長度)
            break;
    }
}

所以綜上所述模型:
PUSH:接受到資料之後就出發OnReceive,由開發人員自己實現上述拆包和計算緩衝區的管理邏輯。
PULL:接受到資料之後就出發OnReceive,但是開發人員只需要維護資料包的長度,資料緩衝區管理HP內部幫你做了,當足夠一個包的時候,Fetch獲取一個完整的資料包就OK了。
PACK:接受到資料之後就出發OnReceive,開發人員不必管理上述的過程,OnReceive的資料就是一個完整的包。