环形缓冲buf的创建

用于网络接受到字节时,放入缓冲buf,然后取出解析。使用时需要上锁

typedef struct tagRingBuf
{
u32 m_dwBufSize;
u8 *m_pbyBuf;
u32 m_dwHead;
u32 m_dwTail;

}TRingBuf;

//创建环形Buf
HANDLE RingBufCreate(u32 dwBufSize)
{
TRingBuf *ptRingBuf = NULL;

if(0 == dwBufSize)
    return NULL;

ptRingBuf = (TRingBuf*)malloc(sizeof(TRingBuf));
if(NULL == ptRingBuf)
{
    return NULL;
}
memset(ptRingBuf, 0, sizeof(TRingBuf));
ptRingBuf->m_dwBufSize = dwBufSize;

//创建Buf
ptRingBuf->m_pbyBuf = (u8*)malloc( dwBufSize);
if(!ptRingBuf->m_pbyBuf)
{
    free( ptRingBuf);
    return NULL;
}
memset(ptRingBuf->m_pbyBuf, 0, dwBufSize);

//初始化头尾
ptRingBuf->m_dwTail = 0;
ptRingBuf->m_dwHead = dwBufSize-1;

return (HANDLE)ptRingBuf;

}

//删除环形Buf
void RingBufDelete(HANDLE hRingBuf)
{
TRingBuf *ptRingBuf = NULL;

if(!hRingBuf)
    return;

ptRingBuf = (TRingBuf*)hRingBuf;
free(ptRingBuf->m_pbyBuf);
free( ptRingBuf);

}

//重置环形Buf
void RingBufReset(HANDLE hRingBuf)
{
TRingBuf *ptRingBuf = NULL;

if(!hRingBuf)
    return;

ptRingBuf = (TRingBuf*)hRingBuf;

//初始化头尾
ptRingBuf->m_dwTail = 0;
ptRingBuf->m_dwHead = ptRingBuf->m_dwBufSize-1;

}

//获取Buf使用大小
u32 RingBufUsedSizeGet(HANDLE hRingBuf)
{
TRingBuf *ptRingBuf = NULL;

if(!hRingBuf)
    return 0;

ptRingBuf = (TRingBuf*)hRingBuf;

if(ptRingBuf->m_dwTail > ptRingBuf->m_dwHead)
{
    return (ptRingBuf->m_dwTail-ptRingBuf->m_dwHead-1);
}
else
{
    return(ptRingBuf->m_dwBufSize+ptRingBuf->m_dwTail-ptRingBuf->m_dwHead-1);
}

}

//获取Buf空闲大小
u32 RingBufFreeSizeGet(HANDLE hRingBuf)
{
TRingBuf *ptRingBuf = NULL;

if(!hRingBuf)
    return 0;

ptRingBuf = (TRingBuf*)hRingBuf;

return (ptRingBuf->m_dwBufSize-RingBufUsedSizeGet(hRingBuf)-2);

}

//放入数据,返回实际放入大小
u32 RingBufDataPut(HANDLE hRingBuf, u8 *pData, u32 dwDataLen)
{
TRingBuf *ptRingBuf = NULL;
u32 dwFreeSize = 0, dwRealPutLen = 0;
u32 dwSect1Len = 0, dwSect2Len = 0;

if(!hRingBuf)
    return 0;

ptRingBuf = (TRingBuf*)hRingBuf;

if(ptRingBuf->m_dwHead > ptRingBuf->m_dwTail)
{
    dwFreeSize = ptRingBuf->m_dwHead-ptRingBuf->m_dwTail-1;
    dwRealPutLen = (dwDataLen < dwFreeSize ? dwDataLen : dwFreeSize);
    memcpy(ptRingBuf->m_pbyBuf+ptRingBuf->m_dwTail, pData, dwRealPutLen);
    ptRingBuf->m_dwTail += dwRealPutLen;
    return dwRealPutLen;
}

dwFreeSize = ptRingBuf->m_dwBufSize+ptRingBuf->m_dwHead-ptRingBuf->m_dwTail-1;
dwRealPutLen = (dwDataLen < dwFreeSize ? dwDataLen : dwFreeSize);
//分2段拷贝
dwSect1Len = ptRingBuf->m_dwBufSize-ptRingBuf->m_dwTail;
if(dwSect1Len > dwRealPutLen)
{
    dwSect1Len = dwRealPutLen;
}

dwSect2Len = dwRealPutLen-dwSect1Len;

memcpy(ptRingBuf->m_pbyBuf+ptRingBuf->m_dwTail, pData, dwSect1Len);
ptRingBuf->m_dwTail = ((ptRingBuf->m_dwTail+dwSect1Len)%ptRingBuf->m_dwBufSize);
pData += dwSect1Len;

if(!dwSect2Len)
    return dwRealPutLen;

memcpy(ptRingBuf->m_pbyBuf+ptRingBuf->m_dwTail, pData, dwSect2Len);
ptRingBuf->m_dwTail = ((ptRingBuf->m_dwTail+dwSect2Len)%ptRingBuf->m_dwBufSize);

return dwRealPutLen;

}

//取数据,dwReadLen欲读取长度,返回实际读取大小
u32 RingBufDataGet(HANDLE hRingBuf, u8 *pBuf, u32 dwReadLen)
{
TRingBuf *ptRingBuf = NULL;
u32 dwUsedSize = 0, dwRealGetLen = 0;
u32 dwSect1Len = 0, dwSect2Len = 0;

if(!hRingBuf)
    return 0;

ptRingBuf = (TRingBuf*)hRingBuf;

dwUsedSize = RingBufUsedSizeGet(hRingBuf);

dwRealGetLen = (dwReadLen > dwUsedSize ? dwUsedSize : dwReadLen);

if(ptRingBuf->m_dwTail > ptRingBuf->m_dwHead)
{
    memcpy(pBuf, ptRingBuf->m_pbyBuf+ptRingBuf->m_dwHead+1, dwRealGetLen);
    ptRingBuf->m_dwHead += dwRealGetLen;
    return dwRealGetLen;
}

//分2段拷贝
dwSect1Len = ptRingBuf->m_dwBufSize-ptRingBuf->m_dwHead-1;
if(dwSect1Len > dwRealGetLen)
{
    dwSect1Len = dwRealGetLen;
}
dwSect2Len = dwRealGetLen-dwSect1Len;

if(dwSect1Len)
{
    memcpy(pBuf, ptRingBuf->m_pbyBuf+ptRingBuf->m_dwHead+1, dwSect1Len);
    pBuf += dwSect1Len;
    ptRingBuf->m_dwHead += dwSect1Len;
}

if(!dwSect2Len)
    return dwRealGetLen;

memcpy(pBuf, ptRingBuf->m_pbyBuf, dwSect2Len);
ptRingBuf->m_dwHead = (dwSect2Len-1);

return dwRealGetLen;

}

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值