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

📄 nwiocompletionport.cpp

📁 这是我做的一个iocp的服务器端的测试代码
💻 CPP
字号:
#include "StdAfx.h"
#include "NWIOCompletionPort.h"
#include "NWException.h"
CIOCompletionPort CIOCompletionPort::m_Instance ;

CIOCompletionPort::CIOCompletionPort( size_t maxConcurrency )
: m_iocp( ::CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, maxConcurrency ) )
{
	if ( m_iocp == 0 )
	{
		Trace("CIOCompletionPort::CIOCompletionPort() - CreateIoCompletionPort(%d)" , ::GetLastError() );
	}
}

CIOCompletionPort::~CIOCompletionPort(void)
{ 
	try
	{
		if (m_iocp) 
		{
			PostQueuedCompletionStatus(m_iocp, 0, (DWORD) NULL, NULL);
			CloseHandle(m_iocp); 
			m_iocp= NULL; 
		} 
	} 
	catch(...) 	
	{ 
		Trace("SAFE_CLOSEHANDLE error\n");
	}
}


int CIOCompletionPort::BindDevice( HANDLE hDevice, ULONG_PTR completionKey )
{
	MYEXCEPTIONFUNC_START();
	if ( m_iocp != ::CreateIoCompletionPort( hDevice,
		m_iocp, 
		completionKey, 
		0 ) )
	{
		throw_NWExceptionC("CIOCompletionPort::AssociateDevice() - CreateIoCompletionPort", ::GetLastError() );
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::AssociateDevice()");
}

void CIOCompletionPort::PostStatus( ULONG_PTR completionKey, 
								   DWORD dwNumBytes /* = 0 */, 
								   OVERLAPPED *pOverlapped /* = 0 */) 
{
	MYEXCEPTIONFUNC_START();
	if ( 0 == ::PostQueuedCompletionStatus( m_iocp, 
		dwNumBytes, 
		completionKey, 
		pOverlapped ) )
	{
		throw_NWExceptionC("CIOCompletionPort::PostStatus() - PostQueuedCompletionStatus", ::GetLastError() );
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_NOREV_END("CIOCompletionPort::PostStatus( )");
}

DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey, 
								   PDWORD pdwNumBytes,
								   OVERLAPPED **ppOverlapped )
{
	MYEXCEPTIONFUNC_START();
	if ( 0 == ::GetQueuedCompletionStatus( m_iocp, 
		pdwNumBytes, 
		pCompletionKey, 
		ppOverlapped, 
		INFINITE ) )
	{
		throw_NWExceptionC("GetQueuedCompletionStatus Error", ::GetLastError());
	}

	iRetCode = S_OK;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::GetStatus");
}

DWORD CIOCompletionPort::GetStatus( ULONG_PTR *pCompletionKey, 
								   PDWORD pdwNumBytes,
								   OVERLAPPED **ppOverlapped, 
								   DWORD dwMilliseconds)
{
	MYEXCEPTIONFUNC_START();
	iRetCode = ::GetQueuedCompletionStatus( m_iocp, 
		pdwNumBytes, 
		pCompletionKey, 
		ppOverlapped, 
		dwMilliseconds ) ;
	if ( iRetCode != 0 )
	{
		DWORD lastError = ::GetLastError();

		if ( lastError != WAIT_TIMEOUT )
		{
			throw_NWExceptionC("GetQueuedCompletionStatus Error", lastError);
		}

		return S_FALSE;
	}

	iRetCode =  S_OK;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::GetStatus");
}

int CIOCompletionPort::InitWorkerThreads(int nThreadNumber,IMessageProcess * pcMessageProccess,CSocketServer * pcSockServer)
{
	MYEXCEPTIONFUNC_START();
	pNWWorkerThread pWorkerThread;
	for (int nIndex = 0 ; nIndex < nThreadNumber; nIndex ++)
	{
		pWorkerThread = new NWWorkerThread ;
		pWorkerThread->m_pcMessageProccess = pcMessageProccess;
		pWorkerThread->m_pcSocketServer = pcSockServer; 
		m_lsWorkerThreadList.AddTail(pWorkerThread);
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::StartWorkerThreads()");
}


int CIOCompletionPort::StartWorkerThreads()
{
	MYEXCEPTIONFUNC_START();
	
	if (m_lsWorkerThreadList.GetCount() <= 0)
	{
		throw_NWException("m_lsWorkerThreadList.GetCount() <= 0");
	}
	if (m_lsWorkerThreadList.GotoHead() != NULL)
	{
		throw_NWException("m_lsWorkerThreadList.GotoHead() != NULL");
	}
    pNWWorkerThread pWorkerThread = NULL;
    do 
    {
		pWorkerThread = m_lsWorkerThreadList.GetCur();
		if (pWorkerThread)
		{
			pWorkerThread->Start();

		}
    } while (m_lsWorkerThreadList.GotoNext() == NULL);

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::StartWorkerThreads()");

}

int CIOCompletionPort::StopWorkerThreads()
{
	MYEXCEPTIONFUNC_START();
	if (m_lsWorkerThreadList.GetCount() <= 0)
	{
		throw_NWException("m_lsWorkerThreadList.GetCount() <= 0");
	}
	if (m_lsWorkerThreadList.GotoHead() != NULL)
	{
		throw_NWException("m_lsWorkerThreadList.GotoHead() != NULL");
	}
	pNWWorkerThread pWorkerThread = NULL;
	do 
	{
		pWorkerThread = m_lsWorkerThreadList.GetCur();
		if (pWorkerThread)
		{
			pWorkerThread->DoStopRun();

		}
	} while (m_lsWorkerThreadList.GotoNext() == NULL);

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::StopWorkerThreads()");
}

int CIOCompletionPort::UninitWorkerThreads()
{
	MYEXCEPTIONFUNC_START();
	pNWWorkerThread pWorkerThread = NULL;
	while (m_lsWorkerThreadList.GetCount() > 0)
	{
		m_lsWorkerThreadList.RemoveHead(pWorkerThread);
		if (pWorkerThread != NULL)
		{ 
			delete pWorkerThread ;
			pWorkerThread = NULL;
		}
	}

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("CIOCompletionPort::StopWorkerThreads()");
}

⌨️ 快捷键说明

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