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