用于网络接受到字节时,放入缓冲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;
}
“`