C++中使用Socket通信包定义和读取方法

来源:互联网 发布:ubuntu 16.04 wingide 编辑:程序博客网 时间:2024/05/19 17:26

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

原创粉丝点击