常见cs程序自定义数据包描述
常见cs程序自定义包可分为块型包、非块型包,非块型包如http协议的,用\r\n\r\n结束,我们这里重点讨论块型包,块型包常见头部如下:
Struct PKHEAD
{
Union
{
DWORD type;
Struct
{
WORD mtype;
WORD stype;
};
};
DWORD len;
Char buf[0];
};
内容buf部分常见组织方式莫过于定长、变长两种。定长的很简单,如struct item{…};作为内容部分,如果不涉及到高低序问题很好办,涉及到序的时候转换一下。变长部分常见组织方式有这么一些经典方法:
1、 Content1 \0 content2 \0 content3 \0 …
2、 json描述。
3、 xml描述。
方法1是效率很高的,对ansi型字符串或者utf8型字符串都没有问题,对utf16型字符串不行。解析这类变长部分的时候特别要注意包尾部的0,或者在缓冲区外部总保证存在一个0,或者保证包内尾部总存在一个结尾0,总之最后一个string要保证有一个合法的0结束,当然可能涉及到一些数值型到string型的转换可能会导致效率下降,1的缺点在于只有一个层次。如果将内容看作key1\0value1\0key2\0value2\0…可解决无序问题,但终归只有一个层次,不方便表示树形数据。
方法2的效率介于1和3之间,2由于描述很简洁,解析也是比较快的,比1好在可以解析任意层数据,嵌套N层都无所谓,阅读也很方便,解析的时候如果原始缓冲不释放可让字符串不复制直接记录在原始缓冲中的指针,这样可进一步提高解析效率。QQ种菜的通讯协议就是json格式的,阅读很方便,解析效率也可以,总的效率适中。
方法3的解析效率是最低的,好在xml描述性也比较强,解析代码也很多,跟上层应用交互的时候也比较方便,作为一个支持变长的选择也是可行的,不过如果特别在意效率的情况下避免使用,xml的解析效率比 2低了近一个数量级,比1可能低近2个数量级。
当然自定义包还有更多格式选择,标准协议也有很多如im 里面常见的xmpp,google的protocol buffers等,还有json的一些扩展协议,如bjson等,如果只是处理一般的网游数据可能用不上这么复杂的协议,用上面提到的定长struct+1 or 2 or 3基本可以解决所有协议需求。也见到一些朋友自定义类型信息描述格式,个人觉得或许没有必要,特别是json如此流行的情况下再自己定义似乎有重复发明轮子的嫌疑,当然具体情况具体对待,一切以满足需求为目标。