|
|
发表于 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底层的事情,和封包无关
|
|