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