⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iocpbuffer.cpp

📁 iocp vc例子,自己是学DELPHI
💻 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 + -