由于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; // 定长度数据内容长度