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

📄 nwclientconnect.cpp

📁 这是我做的一个iocp的服务器端的测试代码
💻 CPP
字号:
#include "StdAfx.h"
#include "NWClientConnect.h"
#include "NWIOCompletionPort.h" 
#include "NWSendThread.h"
#include "IOBuffer.h"
NWClientConnect::NWClientConnect(void)
:m_pcOutBuffer(new CIOBuffer(false))
,m_pcInBuffer(new CIOBuffer(true))
,m_ulClientIndex(0)
{
}

NWClientConnect::NWClientConnect(SOCKET ClientSocket,CSockAddr * pAddrInfo)
:m_pcOutBuffer(new CIOBuffer(false))
,m_pcInBuffer(new CIOBuffer(true))
,m_ulClientIndex(0)
{
    m_Socket = ClientSocket ;
	m_pDataAddr = *pAddrInfo;
}

NWClientConnect::~NWClientConnect(void)
{
	Close();
	if (m_pcOutBuffer)
	{
		delete m_pcOutBuffer;
		m_pcOutBuffer = NULL ;
	} 
	if (m_pcInBuffer)
	{
		delete m_pcOutBuffer;
		m_pcOutBuffer = NULL ;
	}
}


int NWClientConnect::StartRead()
{
	MYEXCEPTIONFUNC_START();

	DWORD dwNumBytes = 0;
	DWORD dwFlags = 0; 
    
	if ( SOCKET_ERROR == ::WSARecv(
		m_Socket, 
		m_pcInBuffer->GetWSABUF() , 
		1, 
		&dwNumBytes,
		&dwFlags,
		&(m_pcInBuffer->m_Overlapped), 
		NULL ) )
	{
		DWORD lastError = ::WSAGetLastError();

		if ( ERROR_IO_PENDING != lastError )
		{
			throw_NWException("ERROR_IO_PENDING != lastError");
		}
	}

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWClientConnect::StartRead()");
}

int NWClientConnect::GetUploadStruct(pNWDataBuffer & UploadBuff)
{
	MYEXCEPTIONFUNC_START();

	if ( UploadBuff == NULL)
	{
		throw_NWException("UploadBuff == NULL");
	}
    
	UploadBuff->m_DataAddr = m_pDataAddr;
    UploadBuff->m_SocketKey = this ;

	memcpy(UploadBuff->DataBuffer,m_pcInBuffer->GetBuffer()+sizeof(WORD),m_pcInBuffer->m_nCurDatasetLen -sizeof(WORD) );
    UploadBuff->BuffLength = m_pcInBuffer->m_nCurDatasetLen -sizeof(WORD) ;

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWClientConnect::GetUploadStruct()");
}

int NWClientConnect::StartSend(const char * pDataBuffer,int nBufferLen)
{
	MYEXCEPTIONFUNC_START();
    
	m_pcOutBuffer->WriteDatasetBuf((BYTE *)pDataBuffer,nBufferLen);

	iRetCode = NWSendThread::GetInstance()->WriteOneBuff(m_pcOutBuffer);
	if (iRetCode != 0)
	{
		throw_NWException("WriteOneBuff error");
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("");
}

int NWClientConnect::BindToIOCP()
{
	MYEXCEPTIONFUNC_START();
	iRetCode = CIOCompletionPort::GetInstance()->BindDevice((HANDLE)m_Socket,(ULONG_PTR)this);
	if (iRetCode != 0)
	{
		throw_NWException("BindDevice Error");
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWClientConnect::BindToIOCP()");
}

void NWClientConnect::DoClientClose()
{
	
	Shutdown( SD_RECEIVE );
	
}

void NWClientConnect::Shutdown( int how /* = SD_BOTH */ )
{
	MYEXCEPTIONFUNC_START();
	if ( IsValid() )
	{
		if ( 0 != ::shutdown( m_Socket, how ) )
		{
			throw_NWExceptionC("CSocketServer::Server::Shutdown() - ",::WSAGetLastError() ) ;
		}

		Trace("shutdown initiated");
	}
	MYEXCEPTIONFUNC_NOREV_END("NWClientConnect::Shutdown()");
}

bool NWClientConnect::IsValid()
{
	return (INVALID_SOCKET != m_Socket);
}

void NWClientConnect::InternalClose()
{ 

	if ( IsValid() )
	{
		if ( 0 != ::closesocket( m_Socket ) )
		{
			throw_NWExceptionC("CSocketServer::Socket::InternalClose() - closesocket - ", ::WSAGetLastError()  );
		}

		m_Socket = INVALID_SOCKET;
	}
}

void NWClientConnect::Close()
{
	if ( IsValid() )
	{
		InternalClose(); 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -