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

📄 nwsendthread.cpp

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

NWSendThread NWSendThread::m_Instance ;
NWSendThread::NWSendThread(void)
{
	m_lsSendBufferList.SetMaxCount(MAX_SENDTHREAD_BUFFER_COUNT);
}

NWSendThread::~NWSendThread(void)
{

}

int NWSendThread::Init()
{
	MYEXCEPTIONFUNC_START();
	m_hHaveMSGInfoEvent = CreateEvent( 0 , true , false , 0 ) ;
	if (m_hHaveMSGInfoEvent == 0
		|| m_hHaveMSGInfoEvent == INVALID_HANDLE_VALUE )
	{
		throw_Memory("Create m_hHaveMSGInfoEvent Error") ;
	}


	m_hHaveRelaseEvent = CreateEvent( 0 , true , true , 0 ) ;
	if (m_hHaveRelaseEvent == 0
		|| m_hHaveRelaseEvent == INVALID_HANDLE_VALUE )
	{
		throw_Memory("Create m_hHaveRelaseEvent Error") ;
	}
	iRetCode = 0 ; 
	MYEXCEPTIONFUNC_END("NWSendThread::Init()");
}
int NWSendThread::Run()
{
	MYEXCEPTIONFUNC_START();

	HANDLE handlesToWaitFor[2];

	handlesToWaitFor[0] = m_hExitEvent;
	handlesToWaitFor[1] = m_hHaveMSGInfoEvent ;

	while (m_bContinue)
	{
		DWORD waitResult = ::WaitForMultipleObjects( 2,
			handlesToWaitFor, 
			false, 
			INFINITE );
		if (waitResult == WAIT_TIMEOUT)
		{
			Trace("NWSendThread::Run::WaitForMultipleObjects timeout");
			continue ;
		}
		else if ( waitResult == WAIT_OBJECT_0 )
		{
			Trace("NWSendThread::线程收倒退出事件");
			break;
		}
		else if (waitResult == WAIT_OBJECT_0 + 1)
		{
			MYEXCEPTIONFUNC_START();
			pCIOBuffer pIOBuffer  = NULL ;
			iRetCode = GetOneBuffer(pIOBuffer);
			if (iRetCode !=0 || pIOBuffer == NULL)
			{
				throw_NWException("iRetCode !=0 || pIOBuffer == NULL");
			}

			iRetCode = pIOBuffer->StartSendBuf(m_SendSocket);
			{
				throw_NWException("StartSendBuf Error ");
			}
			MYEXCEPTIONFUNC_NOREV_END("CMSGProcessThread::Run::DO");
		}

	}
	iRetCode = 0 ;
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWSendThread::Run()");
}

int NWSendThread::UnInit()
{
	MYEXCEPTIONFUNC_START();
	if ( m_hHaveMSGInfoEvent != 0
		&& m_hHaveMSGInfoEvent != INVALID_HANDLE_VALUE )
	{
		CloseHandle( m_hHaveMSGInfoEvent ) ;

		m_hHaveMSGInfoEvent = 0 ;
	}


	if ( m_hHaveRelaseEvent != 0
		&& m_hHaveRelaseEvent != INVALID_HANDLE_VALUE )
	{
		CloseHandle( m_hHaveRelaseEvent ) ;
		m_hHaveRelaseEvent = 0 ;
	}
	iRetCode= 0 ;
	MYEXCEPTIONFUNC_END("NWSendThread::UnInit()");
}


int NWSendThread::WriteOneBuff(pCIOBuffer pSendBuffer)
{
	MYEXCEPTIONFUNC_START();
	HANDLE hWaitHandle[2] ;
	DWORD dwWaitRev = 0 ;

	hWaitHandle[0] = m_hExitEvent;
	hWaitHandle[1] = m_hHaveRelaseEvent ;
	if ( hWaitHandle[0] == 0 
		|| hWaitHandle[1] == 0 
		|| hWaitHandle[0] == INVALID_HANDLE_VALUE 
		|| hWaitHandle[1] == INVALID_HANDLE_VALUE )
	{
		throw_NWException("on NWIOBufferManager::AddBufferToList") ;
	}
	dwWaitRev = WaitForMultipleObjects( 2, hWaitHandle , false , -1 ) ;//无限等待有数据,或者退出
	if ( dwWaitRev == WAIT_TIMEOUT )
	{
		Fail("m_lsSendBufferList::AddToTail Timer Out ") ;//一直没有数据
		return -1;
	}
	else if ( dwWaitRev == WAIT_OBJECT_0 )
	{
		Trace(" NWSendThread 收到退出命令。 " ) ;
		return 1;
	}
	else if ( dwWaitRev == WAIT_OBJECT_0 + 1 )
	{
		m_lsSendBufferList.LockList();
		try
		{

			iRetCode = m_lsSendBufferList.AddTail( pSendBuffer  ) ;
			if ( iRetCode != 0 )
			{
				Fail(" m_lTempMsgDataList.AddTail Error ") ;
				throw 0 ;
			}

			if ( m_lsSendBufferList.GetCount() >= (MAX_SENDTHREAD_BUFFER_COUNT  -1))
			{
				if(!ResetEvent(m_hHaveRelaseEvent))
				{ 
					//缓冲满,要等待释放后再继续添加  
					Fail("Reset m_hHaveRelaseEvent Error ");
					throw 0 ;
				}	
			}
			if ( ! SetEvent( m_hHaveMSGInfoEvent ) )
			{
				iRetCode = -1 ;
				Fail("SetEvent m_hHaveMSGInfoEvent Error ") ;
				throw 0  ;
			}


			iRetCode = 0 ;
			m_lsSendBufferList.UnLockList();
		}
		catch (...) 
		{
			m_lsSendBufferList.UnLockList();
		}
	}

	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWSendThread::WriteOneBuff");
}

int NWSendThread::GetOneBuffer(pCIOBuffer & pSendBuffer)
{
	MYEXCEPTIONFUNC_START();
	int iRetCode = 0 ;
	HANDLE hWaitHandle[2] ;
	hWaitHandle[0] = m_hExitEvent ;
	hWaitHandle[1] = m_hHaveMSGInfoEvent ;

	if ( hWaitHandle[0] == 0 
		|| hWaitHandle[1] == 0 
		|| hWaitHandle[0] == INVALID_HANDLE_VALUE 
		|| hWaitHandle[1] == INVALID_HANDLE_VALUE )
	{
		throw_NWException("MSGMinusTmpList::GetFromHead") ;
	}


	if ( m_lsSendBufferList.IsEmpty() )
	{
		if ( ! ResetEvent( m_hHaveMSGInfoEvent ) )
		{
			Fail("Reset m_hHaveMSGInfoEvent Error ") ;
			return -1;
		};
	}

	DWORD dwWaitRev = 0 ;

	dwWaitRev = WaitForMultipleObjects( 2, hWaitHandle , false , 10 *1000 ) ;//无限等待有数据,或者退出
	if ( dwWaitRev == WAIT_TIMEOUT )
	{
		Fail("m_lsSendBufferList::GetFromHead Timer Out ") ;//一直没有数据
		return -1 ;
	}
	else if ( dwWaitRev == WAIT_OBJECT_0 )
	{
		Trace(" NWSendThread 收到退出命令。 " ) ;
		return 1 ;
	}
	else if ( dwWaitRev == WAIT_OBJECT_0 + 1 )
	{ 

		pSendBuffer = NULL ;
		pCIOBuffer pBuffer = NULL ;
		m_lsSendBufferList.LockList();
		try
		{  
			m_lsSendBufferList.RemoveHead(pBuffer);

			if ( m_lsSendBufferList.GetCount() < (MAX_SENDTHREAD_BUFFER_COUNT * 3/4 ))
			{
				if ( ! SetEvent( m_hHaveRelaseEvent ) )
				{
					Fail("SetEvent m_hHaveRelaseEvent Error ") ;
				};
			}	

			pSendBuffer = pBuffer ;

			iRetCode = 0 ;
			m_lsSendBufferList.UnLockList();
		}
		catch (...)
		{
			m_lsSendBufferList.UnLockList();
		}	
	}
	iRetCode = 0 ;
	MYEXCEPTIONFUNC_END("NWSendThread::GetOneBuffer()");
}

⌨️ 快捷键说明

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