C++中使用Socket通信包定義和讀取方法

由於TCP/IP協議中,不能攜帶我們數據的長度,也就是說如果我們發的數據爲變長度,接收端收到若干字符後就不知道是不是發送完成了,還是要繼續等待,一般來說,VC中的解決方案爲發送端和接收端 定義一組共享的 通信協議包,發送按照通用接口將這些結構體包數據發送出去,接收者判斷每個包類型,組裝成不同的結構體,完成一次網絡傳輸。關鍵問題有:

1. 每個結構體包都需要在開頭定義自己的標識符,可以用1 byte整數約定,附加的,可以定義包數據總長度(包括指針指向數據的長度)

2. 對於丁長度數據,可以不定義成員數據的長度,但是對於變長度(指針指向的數據), 必需定義包的時候,附件長度,使接收端接收後,知道還需讀取多上長度數據這個指針指向的數據發送完畢。

3. 發送端更具不同的包類型, 寫若干個通用的發送函數,接收端也類似的寫相應多個的接受函數,進行迭代調用,很容易實現通用的發送和接受接口,使得該接口對調用者完全透明。

 

通信包結構體可以如下定義:

 

// 每個包都有的頭信息

struct PK_HEAD {
    BYTE pkType;
    DWORD pkLength;
};

struct PK_A{
    PK_HEAD head;            // 每個包都有的頭信息,標記此通信包的總長和包類型。
    DWORD contentLength;    //字符型數據內容長度
    BYTE* content;            //字符型數據內容
    DWORD content0Length;    // 定長度數據內容長度
    BYTE[10000] content0;   
    PK_A nag;

    DWORD pkBLength;
    PK_B* pkB;
};

struct PK_B{
        PK_HEAD head;            // 每個包都有的頭信息,標記此通信包的總長和包類型。
}

 

// 接受時
read()
{
        int pkType = .../
        // 根據第一個byte判斷不同包類型,調用子函數遞歸組裝其他PK通信包。
        switch()
            angn
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章