联众升级协议分析4

 
联众升级协议分析 续篇(三)

云网(jimzj@21cn.com

接上篇

下面就去如何去分析每个命令字作说明:

       在这之前,我们先定义每一个包的包头结构:

typedef struct _tagPackHead

{

    int     nCommand ;      //命令字

    int     nDataLen ;          //包长度

}PackHead, *lpPackHead ;

上面的得到一个完整的协议包时已用到这个结构了。

 

一、登录用户命令

0x0000   00 02 00 80 C8 00 00 00-01 00 00 00 04 00 02 00   ...€?..........

0x0010   00 00 00 00 79 6F 75 73-68 69 5F 31 39 38 31 00   ....dddddd_1981.

0x0020   00 B3 03 00 00 00 00 00-C5 DC C5 DC C5 DC CC F8   .?.....是是是是

0x0030   00 C5 00 00 00 00 00 00-C7 00 FF 00 00 00 00 00   .?.....?.....

0x0040   01 00 00 00 68 6F 6E 64-61 30 34 31 32 00 00 00   ....ffffff0412...

………………..

从数据上看,命令字是0x80000200我们不必要每一个数据都要知道它是什么意思,只要找到我们的一数据就行了。从上面所标志的颜色来看,前面的是命令字,红色的是什么呢?大家想一下,打升级一共是四个人,呵呵,你大概会明白了,这个是服务器分配给每个用户的编号,这个很重要,因为其它指令中不会再出现用户名称了,只会有一个用户编号。经过多次分析,用户的编号是固定的,我们按座位坐下来时分,如下面所示:(是在大厅中坐下等人时,不是出牌时)

                             1

                  0    ------|------  2

                            3

 


包的前面一部分是用户个数据,后面的就是每一个用户的信息,所以我们定义的包结构如下:

typedef struct _tagRespSHJIUserRegister

{

    int     nFlag0 ;

    char    cUCount ;       //用户数

    char    cFlag1 ;

    char    cDaPai ;

    char    cFlag4 ;

}RespSHJIUserRegister, *lpRespSHJIUserRegister;

 

typedef struct _tagGameUserInfo

{

    char    cUserNum ;      //用户编号

    char    cFlag1 ;

    char    cFlag2 ;

    char    cFlag3 ;

    char    cUser[ 20 ] ;    //用户登录名称

    char    cAlia[ 20 ] ;     //用户中文名称

    int     nFlag4 ;

}GameUserInfo, *lpGameUserInfo;

 

用户的名称是20个字节,上一篇文章已说明;

上面说明AnalyLinkRecvPack函数中用到的DispatchPackets如下所示:(这个就是分解每一个包了)

void __fastcall TFrmMain::DispatchPackets( const char * pPack )

{

    PackHead * pPackHead = ( PackHead * )pPack ;        //包头

 

    if( pPackHead->nDataLen > MAX_COMMAND_SIZE - sizeof( PackHead )) return ;

 

    switch( pPackHead->nCommand )

    {

        case RESP_SHJI_USER_REGISTER :

            if( pPackHead->nDataLen >= sizeof( RespSHJIUserRegister ) + sizeof( GameUserInfo ))              //过滤错误的包

            {

                RevGameUserInfo(( char * )( pPackHead + 1 )) ;              //包内容

            }

break ;

…………………………..

}

 

函数RevGameUserInfo就是分解用户信息的,上面我们已定义了包的结构,所以取得用户的信息就很容易了:

 

void __fastcall TFrmMain::RevGameUserInfo( char * pPackContent )

{

    RespSHJIUserRegister * pInfo = ( RespSHJIUserRegister * )pPackContent ;

 

    int nUserCount = pInfo->cUCount ;

    for( int i = 0 ; i < nUserCount ; i ++ )   //共有四个用户

    {

        GameUserInfo * pUser = ( GameUserInfo * )( ( char * )( pInfo + 1 ) + i * sizeof( GameUserInfo )) ;

 

        switch( pUser->cUserNum )

        {

            case POS_LEFT : //编号为0的用户

                PanelLeft->Caption  = ( String )pUser->cAlia ;

                break ;

            case POS_TOP  : //编号为1的用户

                PanelTop->Caption   = ( String )pUser->cAlia ;

                break ;

            case POS_RIGHT:  //编号为2的用户

                PanelRig->Caption   = ( String )pUser->cAlia ;

                break ;

            case POS_BOT  : //编号为3的用户

                PanelBot->Caption   = ( String )pUser->cAlia ;

                break ;

        }

    }

}

到此,我们得到了升级中的每一个用户的信息,呵呵,是不是有点成就感了,我们稍为休息一下,喝一口茶。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值