游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2549|回复: 6

请教网络封包这块的问题

[复制链接]

9

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2008-7-14 19:37:00 | 显示全部楼层 |阅读模式
  如题 有资料的 先谢了  [em10] [em10]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-7-14 22:29:00 | 显示全部楼层

Re:请教网络封包这块的问题

看看序列化或者叫“串化”这方面的资料吧,如果可能的话自己写一个,或者用boost里面自带的,已经很不错了
我是自己写的,能完全支持stl里面的容器序列化

9

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2008-7-15 12:14:00 | 显示全部楼层

Re:请教网络封包这块的问题

我在这 块还是空白 能不能说的具体点呢比如 如何拆包 如何拼包 包如何设计  

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-7-15 13:05:00 | 显示全部楼层

Re:请教网络封包这块的问题

enum packetType {
   //动作包,网络传输使用
   MESSAGE_ACTION = 5,                    //普通信息,调试用
   LOGIN_ACTION,                          //登录
   LOGOUT_ACTION,                         //注销
   SUCCESS_ACTION,                        //成功
   FAILED_ACTION,                         //失败
   CHAT_ACTION,                           //聊天
   ROLESIMPLEINFO_ACTION,                 //人物的名称,所在位置的一些简单信息
   ROLESIMPLEINFO_UPDATE_ACTION,          //更新人物所在位置的一些简单信息(区别在于不用通知给其它人,只是更新服务器上的RoleInfo,因为其它刚上线的人需要看到最新的状态)
   ROLE_OUTOF_VISIBLE_RANGE_ACTION,       //服务器通知某角色已经不在可视范围的信息
   SEARCH_9TILE_AROUNDINFO_REQ_ACTION,    //查找当前用户身边的可视范围的角色的请求信息(人物刚出现,可以人物刚出现在一个新地图块中,要读取身边9个tile的信息)
   COLLECTION_AROUND_INFO_ACTION,         //返回用户所需要查找的tile的其他的角色的信息集合
   REMOVE_COLLECTION_AROUND_INFO_ACTION,  //移出身边一些已经不可见的tile的其它角色的信息集合

   //归档包,读写磁盘使用
   TERRAIN_INITPARAM_ARCHIVE,             //场景大地形的初始化参数
   ORIGIN_SCENE_MODEL_ARCHIVE,            //场景对象的原始模型
   CLONE_SCENE_MODEL_ARCHIVE              //场景对象的复制模型
//....
//....
};



typedef struct PacketHeader
{
        DWORD           m_dwLength;          // packet length
        USHORT          m_usOpcode;          // opcode id

        PacketHeader();
        virtual ~PacketHeader();


        //as a serialize able object, in needed methods:

        SerializeTag ComputeTag();

        bool Read(ObjectStream& stream);

        bool Write(ObjectStream& stream);

        DWORD GetLength(ObjectStream& stream);

        bool operator==(const PacketHeader &other) const;

} NetPacket;


//////////////////////////////////////////////////////////////////////////
//成功的消息包
struct SuccessPacket:public PacketHeader
{
        SuccessPacket(){ m_usOpcode = SUCCESS_ACTION; }
};

//////////////////////////////////////////////////////////////////////////
//失败的消息包
struct FailedPacket:public PacketHeader
{
        FailedPacket() { m_usOpcode = FAILED_ACTION; }
};

//////////////////////////////////////////////////////////////////////////
//登录的消息包
struct LoginPacket:public PacketHeader
{
        std::string username;
        std::string password;
        LoginPacket() { m_usOpcode = LOGIN_ACTION;}
        //as a serialize able object, in needed methods:
        SERIALIZED_DECLARE
};

//...
其实只要串化做好了,封包是件很容易的事情,拼包和拆包是tcp/io底层的事情,和封包无关

9

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2008-7-15 19:36:00 | 显示全部楼层

Re:请教网络封包这块的问题

  现在主要的问题就是拆包 和拼包 因为一款网络游戏的流畅性很大部分跟网络通讯有关 如果网络在网络不够好的条件下 一个比较大的消息 也许客服机就接收不到 这 就要求把这个消息分成几个小消息发送 这跟 拼包和拆包有关么?   现在是不是把消息 叫做封包了 ?

9

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2008-7-18 08:39:00 | 显示全部楼层

Re:请教网络封包这块的问题

请问 高手在吗 ? 如果在 回一下我这 菜鸟的问题  谢谢了

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-7-18 12:48:00 | 显示全部楼层

Re:请教网络封包这块的问题

如果是NT架构,你也可以先看看完成端口或重叠端口,里面的字节可以分多次异步投递,对方io队列分多次接受,这个原理比较复杂,不过微软底层封装的非常好,这里面就有你说的那种多次发送和接受一个大包的情况。但仅仅限于TCP,UDP就免了,UDP只发小包,这个我不考虑拼包,有人用UDP拼包建立tcp方式的重发效验拼包机制,我觉得有点无聊。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 23:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表