在网络游戏中,会涉及到数据传送,所以就有一个要解决的问题,如何定义数据包格式,就目前我所知道的数据定义方式描述一下,欢迎各位高手指点,
第一种方式:
定义数据头:
//网络包头
typedef struct PacketHeader
{
 byte  id[4];  //u_int32 lb
 byte  len[4];  //u_int32 lb
 byte  version[2]; //u_int16 lb
 byte  type[2];  //u_int16 lb 

}PacketHeader;

定义数据体:
//网络数据包体
class CPackage
{
public:
 CPackage(void);
 //CPackage(byte* pParam, int nLen);
 ~CPackage(void);
public:
 u_int16 GetType();
 void SetType(u_int16 nType);
 DWORD GetLen();
 void SetLen(int nLen);
 tstring GetContent();
 void SetContent(tstring strContent);
 virtual void* GetPackage();
 void SetBuf(byte* pParam);
 virtual byte*   GetBuf(u_int32 nLen);
protected:
 u_int16  m_nType;
 int   m_nLen;  //这里数据长度代表的是,长度以后要取的字节的个数
 tstring   m_strContent;
 tstring   m_strBuf;
 byte*   m_pBuf;
 PacketHeader m_pHeader;
};
在数据包里面包含 包头, 用函数来实现对包头和包内容的操作。
第二种定义方式:
//网络包头
typedef struct PacketHeader
{
 byte  id[4];  //u_int32 lb
 byte  len[4];  //u_int32 lb
 byte  version[2]; //u_int16 lb
 byte  type[2];  //u_int16 lb 

}PacketHeader;

定义数据体:
//网络数据包体
class CPackage: public PacketHeader
{
public:
 CPackage(void);
 //CPackage(byte* pParam, int nLen);
 ~CPackage(void);
public:
 u_int16 GetType();
 void SetType(u_int16 nType);
 DWORD GetLen();
 void SetLen(int nLen);
 tstring GetContent();
 void SetContent(tstring strContent);
 virtual void* GetPackage();
 void SetBuf(byte* pParam);
 virtual byte*   GetBuf(u_int32 nLen);
protected:
 u_int16  m_nType;
 int   m_nLen;  //这里数据长度代表的是,长度以后要取的字节的个数
 tstring   m_strContent;
 tstring   m_strBuf;
 byte*   m_pBuf;
};

这两种方式的区别,就是一个用包含包头,一个用派生。欢迎有更好解决办法的朋友写出来分享一下.

Posted on 2010-07-19 11:31 郑兴锋 阅读(621) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理