1. 程式人生 > >C++中使用Socket通訊包定義和讀取方法

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