Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329706
  • 博文数量: 100
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 02:50
文章分类

全部博文(100)

文章存档

2011年(5)

2010年(12)

2009年(83)

分类:

2009-12-22 10:04:16

mangosd 之 ByteBuffer
 
    ByteBuffer是mangos进行网络打包的工具,上层应用程序可以用它将应用消息打包成一个序列,然后就可以将这个序列发送到网络上了。不仅仅是网游,只要是网络程序,肯定都需要有相似的东西,只是有些是已经被封装好了,比如http这些上层协议,把底层细节都封装好了,我们看不到而已。
 ByteBuffer的特点在于,重载了<<和>>,所以打包消息的时候不用调用繁琐的打包函数,只需要类似:
ByteBuffer buf;
buf << int_a;
buf << char_b;
     ByteBuffer内部采用一个vector来保存打包数据,这样就可以进行消息打包,解包的时候用>>就可以完成了。这样的方式看起来比较清晰自然,比乏味的调用打包函数要舒服。ByteBuffer对所有的基本类型都定义了重载函数,这就相当于把打包的基本部件全部备齐了,如果你要实现自己的和协议相关的上层打包函数,利用它提供的基本部件就可以自己构造了。
     另外,BuyteBuffer还为vector,list和map提供了<<,>>的重载,可以直接将一个容器进行打包。
     最后,有一个疑问,就是没有看到字节序的处理;我的思想里面是在ByteBuffer里面应该加入字节序的处理,比如在append里面将字节序统一转换为大端(毕竟网络是大端),然后接收方收到数据后再按照大端来解析;但是在这里没有看到字节序的处理(是不是在其他地方?),所以存在跨平台的问题,X86体系结构打出来的是小端,打包后也是小端的顺序,如果是大端机器收到了这个包,用大端的方式解析出来,就不对了(比如0x01020304被解析成了0x04030201了)。
阅读(1646) | 评论(1) | 转发(0) |
0

上一篇:mangosd 之 framework

下一篇:mangosd 之 Patcher

给主人留下些什么吧!~~

chinaunix网友2010-02-10 14:57:06

魔兽世界数据包第一个字节保存的是包的类型,WorldPacket data(SMSG_PVP_CREDIT,4+8+4); 解包时只需要按照固定的格式就可以正常解析.