讨论封包
来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=437837 存档链接: https://web.archive.org/web/20041024220128id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=437837
<<<逻辑层的几种看法 | 首页 | 郁闷终结>>> 讨论封包 我原来想的是……在需要发送数据包时通过代码直接操作buffer来生成数据包……但是后来又一想,如果数据包有很多种,那么这个编码的过程岂不是要花很多时间?而且以后如果要修改数据包结构的话也会很麻烦……看来看去,觉得似乎这种方法可以称为“硬编码”,也就是把数据包的结构直接体现在代码里……假如能编程软编码,比如用字符串来定义一个数据包的结构…… 但是具体的还是不知道该怎么办……而且软编码的话感觉在处理数据包时可能会遇到问题…… 硬编码配合软编码 类似包头这样的结构,直接硬写就好,长度啊,消息类型啊,之类的,一百年不变的。 具体的消息结构,让脚本去做,你就只按照长度分配内存就好。 我后来又想了一下: 让所有对数据包响应的函数都是某个对象的成员函数,这样,无论是什么数据包,其核心任务就是要求客户端调用某个对象的某个成员函数,并输入一个或一些参数,这样,数据包的内容其实就是“对象标识 | 函数标识 | 参数”(暂称它为“数据单元”)(如果函数需要多个参数就把这些参数顺序连接成一个数据块,并把这个数据块传给函数,这样响应函数的原型就能统一起来了),当然在每个标识数据段的前面都有一个四字节(当然也可以在客户端连接到服务器时临时与服务器协商这个长度)的int来说明数据段的长度。 但是也许有时一个数据包里会调用多个对象的多个函数,如果为每一次调用都建立一个上述的数据单元,也行,但是如果调用了同一个对象的多个函数,这时如果把这样的一些数据单元融合起来,也就是先说明一个对象标识,接着就跟着好几组“函数标识 | 参数”,这样就能省略不少对象标识数据所占用的空间和网络带宽,不过这样的话数据包的组织规则就得改了,如果把“对象标识 | 函数标识 | 参数 | 函数标识 | 参数 | 函数标识 | 参数……”这样的融合后的结构也叫做“数据单元”,那么相对于原来结构的变化就是现在每个数据单元之前都要增加一个四字节的int来说明这个数据单元的总长度或者是其中有多少组“函数标识 | 参数”这样的调用,所以在节省了一些对象标识所占用的空间的同时也增加了一些int所占用的空间,这样我就搞不清这样做是否会得不偿失,毕竟对象标识可能也只是一个四字节的int……应该怎么比较这两种结构?前者没有进行优化但也能基本满足需求,而后者进行了“优化”我却无法判断是否得不偿失…… wow采用类似这样的结构发送消息 struct samplemsg{ DWORD dwWhichCmd; DWORD dwLen; //data[里面数据组织的非常COOL] }; 一个网游服务器端的通用部分,如果能做成预想的那样的话就可以让二期开发人员写一些动态连接库,然后让我这个程序载入这些连接库就可以了,我的程序是与游戏内容无关的,连接库里则主要是一些游戏类的定义(比如Sor、Nec这样的类,里面有这种对象的种种响应函数等……),我就得确定一个比较好的数据包组织规则,这样二期开发人员就可以少花时间在数据包的处理上了…… //=============== 网络游戏中 例如人物的走动需要传送人物的当前速度等消息给服务器, 那关于类似的消息(游戏中还有很多其他不同的消息),他们该如何打包? 当一个客户端接收到这个包以后,该如何处理这个消息包?
- 关于处理消息包我们小组目前的构思是: 例如有 MSG_PLAYER_WALK 这个消息, 我们把它定义为一个string 类型的, 然后 string 的结构是 type, PID, speedX, speedY, distanceNeeded 这样一连串的字符, 接收消息后首先判断 type 知道它是 MSG_PLAYER_WALK 这样一个消息, 然后对这个string进行处理,设计相关的成员函数提取相关的信息如 PID,speedX 等. 把这些信息送到游戏中其他的函数中进行进一步处理,从而实现消息的传递. 我们想做一个 MSG 的类 ,做接受跟处理 里面的消息包, 想问一下该如何够架?
- 关于消息打包: ...................... 网络消息有很多类型的。 消息结构很简单: unsigned int type; unsigned int len; unsigned char content; 然后根据不同的type给各个不同的组件自己去解析content的内容。 hongyu 发表于 2004-10-12 | 引用Trackback(0)