📄 iocpbuffer.cpp
字号:
// IocpBuffer.cpp: implementation of the CIocpBuffer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "IocpBuffer.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIocpBuffer::CIocpBuffer()
{
ZeroMemory(&m_olBuffer, sizeof(OVERLAPPED));
m_nIoType = -1;
m_nSendLen = 0;
m_soSocket = INVALID_SOCKET;
m_pSendPacket = NULL;
}
CIocpBuffer::~CIocpBuffer()
{
}
void CIocpBuffer::ResetIoType(int nIoType)
{
m_nIoType = nIoType;
}
void CIocpBuffer::ResetBuffer()
{
ZeroMemory(m_szBuffer, MAXBUFLEN);
m_nBufLen = 0;
m_pSendPacket = NULL;
}
void CIocpBuffer::SetupBuffer(int nIoType)
{
switch (nIoType)
{
case IOTYPE_READ:
{
if (m_nBufLen <= 0)
{
m_wsaBuf.buf = reinterpret_cast<char*>(m_szBuffer);
m_wsaBuf.len = MAXBUFLEN;
}
else
{
m_wsaBuf.buf = reinterpret_cast<char*>(m_szBuffer) + m_nBufLen;
m_wsaBuf.len = MAXBUFLEN - m_nBufLen;
}
}
break;
case IOTYPE_WRITE:
{
if (m_nBufLen<=KEYLEN && m_pSendPacket!=NULL)
{
m_nBufLen = m_pSendPacket->ReadData(m_szBuffer, MAXBUFLEN, m_nSendLen);
}
m_wsaBuf.buf = reinterpret_cast<char*>(m_szBuffer);
m_wsaBuf.len = m_nBufLen;
}
break;
default:
ResetBuffer();
break;
}
}
int CIocpBuffer::ProcessBuffer(CIocpPacket* pPacket)
{
int nErr=ERROR_NONE;
if (pPacket==NULL)
{
nErr = ERROR_FUNC_PARAM_INVALID;
return nErr;
}
pPacket->WriteData(m_szBuffer+KEYLEN, m_nBufLen-KEYLEN);
ResetBuffer();
return nErr;
}
BOOL CIocpBuffer::SendBufferOver(int nIoSize)
{
//要考虑标识位所占的字节数
ASSERT(nIoSize>=0);
ASSERT(m_nBufLen>=nIoSize);
ASSERT(m_pSendPacket!=NULL);
//重新调整缓冲区位置
int nRemainLen=m_nBufLen-nIoSize;
if (nRemainLen>0)
{
memcpy(m_szBuffer+KEYLEN, m_szBuffer+nIoSize, nRemainLen);
m_nBufLen = KEYLEN+nRemainLen;
}
else
{
m_nBufLen = 0;
}
//递增已发送数据长度
m_nSendLen += nIoSize-KEYLEN;
return m_pSendPacket->IsOver(m_nSendLen);
}
ULONG CIocpBuffer::GetKey()
{
ULONG ulRet=0;
if (m_nBufLen>=KEYLEN)
memcpy(&ulRet, m_szBuffer, KEYLEN);
return ulRet;
}
BOOL CIocpBuffer::AddBufferData(const BYTE* szData, int nDataLen)
{
ASSERT(szData!=NULL);
if ((nDataLen+m_nBufLen)>MAXBUFLEN)
return FALSE;
memcpy(m_szBuffer+m_nBufLen, szData, nDataLen);
m_nBufLen += nDataLen;
return TRUE;
}
BOOL CIocpBuffer::FlushBuffer(int nBufLen)
{
if (nBufLen>MAXBUFLEN || nBufLen>m_nBufLen)
return FALSE;
m_nBufLen -= nBufLen;
memmove(m_szBuffer, m_szBuffer+nBufLen, m_nBufLen);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -