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

📄 nwworkerthread.cpp

📁 这是我做的一个iocp的服务器端的测试代码
💻 CPP
字号:
#include "StdAfx.h"
#include "NWWorkerThread.h"
#include "NWIOCompletionPort.h"
#include "SocketServer.h"
#include "IOBuffer.h"
#include "NWClientConnect.h" 
  
NWWorkerThread::~NWWorkerThread(void)
{
}

int NWWorkerThread::Init()
{
	MYEXCEPTIONFUNC_START();
	iRetCode =0 ;
	MYEXCEPTIONFUNC_END("NWWorkerThread::Init");
}

int NWWorkerThread::Run()
{
	MYEXCEPTIONFUNC_START();
	while (m_bContinue)
	{
		DWORD		dwIoSize = 0;
		NWClientConnect		*pClientConnect = 0;
        pCIOBuffer pIoBuffer = NULL ;
		bool weClosedSocket = false;
        OVERLAPPED * pOverLapped = NULL ;
		DWORD dwResult = CIOCompletionPort::GetInstance()->GetStatus( ( PDWORD_PTR )&pClientConnect, &dwIoSize, ( OVERLAPPED ** )&(pOverLapped) );

		if ( dwResult != 0 )
		{				
			if (dwResult == ERROR_NETNAME_DELETED   )
			{
				weClosedSocket = true;
			}
			else if ( WSA_OPERATION_ABORTED != dwResult )
			{
				throw_NWExceptionC( "CIOCompletionPort::GetStatus() - GetQueuedCompletionStatus", dwResult );					
			}

			Trace("IOCP error - client connection dropped");
		}

		if ( !pClientConnect )//推出的时候
		{ 
			break;
		}
        if (weClosedSocket)
        {
            pClientConnect->DoClientClose();

			iRetCode = m_pcSocketServer->m_pcClientManager->DeleteOneClient(pClientConnect->m_ulClientIndex);
			if (iRetCode != 0)
			{
				Trace("DeleteOneClient Error");
				continue ;
			}
            pClientConnect = NULL ; 
        }
		else if (pClientConnect && pClientConnect->m_pcInBuffer && pClientConnect->m_pcInBuffer->m_bIsRecv)
        {
			MYEXCEPTIONFUNC_START();
		    pIoBuffer = pClientConnect->m_pcInBuffer ;

			if (pIoBuffer->CurDataSetIsOver(dwIoSize))
			{
				pNWDataBuffer pUploadBuff = NULL ;
				MYEXCEPTIONFUNC_START();
				pUploadBuff =  new NWDataBuffer; 
				iRetCode = pClientConnect->GetUploadStruct( pUploadBuff );
				if (iRetCode !=0 )
				{
					throw_NWException("GetUploadStruct Error");
					continue;
				}
				if ( !pUploadBuff)
				{
					throw_NWException("pUploadBuff == NULL"); ;
				}
				
				iRetCode = m_pcMessageProccess->OnMessage(pUploadBuff);
				if (iRetCode != 0 )
				{
					throw_NWException("NWIOBufferManager::GetInstance()->AddBufferToList Error");
				}
				pIoBuffer->GotoHead();

				MYEXCEPTIONFUNC_NOREV_END("NWWorkerThread::Run::Do Buffer Oper::upload Data");
				if (pUploadBuff)
				{
					delete pUploadBuff ;
					pUploadBuff = NULL ;
				}

			} 
			else
			{
				pIoBuffer->GotoNext(dwIoSize);
			}
			iRetCode = pClientConnect->StartRead();
			if (iRetCode !=0)
			{
				throw_NWException(" pClientConnect->StartRead");
			}

			MYEXCEPTIONFUNC_NOREV_END("NWWorkerThread::Run::Do Buffer Oper");
        }		 
		/*
		* Thread End Processing
		*/
	}
//    m_pcIocp->GetStatus();


	iRetCode = 0 ;
	Trace("NWWorkerThread::Run End");
	MYEXCEPTIONFUNC_END("NWWorkerThread::Run");
}

void NWWorkerThread::DoStopRun()
{
    MYEXCEPTIONFUNC_START();
	CIOCompletionPort::GetInstance()->PostStatus(0);
	if (RunIsEnd())
	{
		Stop();
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_NOREV_END("NWWorkerThread::DoStopRun()");
}

int NWWorkerThread::UnInit()
{
	MYEXCEPTIONFUNC_START();
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWWorkerThread::UnInit");
}
 

⌨️ 快捷键说明

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