假设需要封装的报文为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; }

评论