正文

一种封装报文的方法2007-02-04 22:05:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ljqy/23114.html

分享到:

 假设需要封装的报文为pucMBufMsg,该缓存前RESERVED_LEN个字节预留为(报文信息+MAC+UDP+IP),从第RESERVED_LEN +1个字节为数据。具体使用方法如下:

 

   #define RESERVED_LEN 100  /*预留假设100个字节*/

 

ULONG *p =  (ULONG*)pucMBufMsg;  /*定义ULONG型指针指向报文*/

     p[0] = ulIndex;   /*第一个4字节可以放置唯一标识,或用户标识,用于区别*/

     p[1] = (ULONG)(pucMBufMsg + RESERVED_LEN);   /*指向数据取*/

     p[2] = ulLen;     /*数据的有效长度*/

 

当我们需要再往缓存里追加数据时,比如希望进行IP封装时只需做如下操作

    ULONG IPHeadLen = 20; /*20B*/

     p[1]  -=  (ULONG*)(UCHAR*)p[1]- IPHeadLen );   /*指向新的数据区*/

     p[2]  +=  IPHeadLen ;     /*数据的有效长度*/

  

     memcpy((void*)p[1], pucIPHead,  IPHeadLen);

 

   可以将以上的一些操作进行如下的封装:

 

/*MBUF中取报文首指针*/

UCHAR * MBUF_MTOD(UCHAR *pMbuf)

{

    ULONG *pHead = (ULONG*)pMbuf;

 

    return (UCHAR*)pHead[1];

}

 

/*报文头增加数据*/

UCHAR *MBUF_PREPEND_MEMORY_SPACE(UCHAR *pMbuf, ULONG uLen)

{

    ULONG pHead = (ULONG*)pMbuf;

    pHead[1] -=  ulLen;  /*报文指针前移*/

    pHead[2] +=  ulLen;  /*报文增加长度*/

}

 

/*获取整个数据长度*/

ULONG MBUF_GET_TOTAL_DATA_LENGTH(UCHAR *pMbuf)

{

    ULONG *pHead = (ULONG*)pMbuf;

 

    return pHead[2];

}

 

/*拷贝数据到另一缓存中*/

ULONG MBUF_CopyDataFromMBufToBuffer(UCHAR *pMbuf, ULONG uLen, UCHAR *pPacket)

{

    if( (NULL == pMbuf) || (NULL == pPacket) )

    {

        return FAIL;

    }

 

    ULONG *pM = (ULONG*)pMbuf;

    UCHAR *pData = (UCHAR*)pM[1];

 

    memcpy(pPacket, pData, uLen);

 

    return OK;

}



阅读(2745) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册