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

📄 cmiocpmudule.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
字号:
#include "CMIocpAccept.h"
#include "CMIocpMudule.h"
#include "CMInetAddress.h"
#include <MatrixCore/Pattern/CMSingleton.h>

using namespace MatrixCore::Pattern;
//CMSingleton<CMDebug>::getInstance()
CMIocpMudule*	CMIocpMudule::m_pSelfInstance = 0;
int				CMIocpMudule::m_iThreadCurrentCnt = 0;
//			CMSingleton<CMDebug>		*pDebugALL;
CMIocpMudule::CMIocpMudule()
	: m_hWorkerIOCP( 0 )
{
	m_UserCount = 0;
	m_pIOAccepter= NULL;
	m_pIOAccepter = NULL;

	for(int i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
	{
		m_pWorkerThread[i] = NULL;
	}
}

CMIocpMudule::CMIocpMudule(char * pIPAddress,int iPort)
	: m_hWorkerIOCP( 0 )
{
	GetInstance()->SetIPAddress(pIPAddress,iPort);
}

CMIocpMudule::~CMIocpMudule()
{
	int i;



	CMWorkerThread::m_stThreadLoop = false;
	//静饭靛啊 磷阑锭鳖瘤 扁笛赴促..
	CMOVERLAPPED *ov = NULL;
	//ov.eState = eEXIT;
	int spin = m_iThreadCurrentCnt;
	for (i = 0; i < spin ; i++)
	{
		PostQueuedCompletionStatus(m_hWorkerIOCP,0,0,ov);
	}

	while(m_iThreadCurrentCnt > 0)
	{
		Sleep(1000);
	}

	if(m_pIOAccepter != NULL)
	{
		delete m_pIOAccepter;
		m_pIOAccepter = NULL;
	}

	for( i = 0 ; i < m_Def_Workerthread ; i++ )
	{
		if(	m_pWorkerThread[i] != NULL)
			delete m_pWorkerThread[i];
	}



	CMSingleton<CMDebug>::releaseInstance();
}

CMIocpMudule* CMIocpMudule::GetInstance()
{
	if( m_pSelfInstance == 0 )
	{
		m_pSelfInstance = new CMIocpMudule();

	}

	return m_pSelfInstance;
}

void CMIocpMudule::ReleaseInstance()
{
	if( m_pSelfInstance != 0 )
	{
		delete m_pSelfInstance;
		m_pSelfInstance = 0;
	}
}

BOOL CMIocpMudule::AddWorkerThead(LPTHREAD_START_ROUTINE StartRoutine)
{
	int i;

	if(NULL == StartRoutine) 
	{
		for( i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
		{
			if(m_pWorkerThread[i] == NULL)
			{
				m_pWorkerThread[i] = new CMWorkerThread();
				m_pWorkerThread[i]->begin();
				m_iThreadCurrentCnt++;
				break;
			}
		}
	}
	else
	{
		for( i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
		{
			if(m_pWorkerThread[i] == NULL)
			{
				m_pWorkerThread[i] = new CMWorkerThread(StartRoutine);
				m_pWorkerThread[i]->begin();
				m_iThreadCurrentCnt++;
				break;
			}
		}
	}

	return TRUE;
}

BOOL CMIocpMudule::DelWorkerThead()
{
	m_iThreadCurrentCnt--;
	return m_iThreadCurrentCnt;
}

bool CMIocpMudule::Initialize(char * pIPAddress,int iPort
							  ,int iMaxAcceptUser,int WorkerThreadMax,LPTHREAD_START_ROUTINE StartRoutine)
{
	GetInstance()->SetIPAddress(pIPAddress,iPort);

	if(WorkerThreadMax > 0 && WorkerThreadMax < DEF_WORKERTHREADMAX)
	{
		m_Def_Workerthread = WorkerThreadMax;
	}
	else
	{
		//檬扁拳 角菩.
		// default 蔼栏肺 技泼
		m_Def_Workerthread = DEF_WORKERTHREAD;
	}

	CMSingleton<CMDebug>::getInstance()->initialize(CMDebug::DEBUGTYPE_FILE,"ERR/NetworkErr");

	CMString IPstring = CMInetAddress::GetHostAddress();

	memset(m_pIPAdress,0,sizeof m_pIPAdress);
	memcpy(m_pIPAdress,IPstring.getBuffer(),IPstring.length());

	m_hWorkerIOCP = ::CreateIoCompletionPort( INVALID_HANDLE_VALUE,
		0, 0,
		4 );				//Number of concurrently executed threads 叼弃飘 蔼 汲沥 
	if( m_hWorkerIOCP == NULL )
		return false;

	int i;

	//况目 静饭靛 积己 DEF_WORKERTHREAD肮荐 父怒 积己 茄促..
	// StartRoutine俊 器牢磐啊 逞绢 柯促搁 况农 静饭靛啊 扼捞宏矾府 官冰俊辑 捣促绰 捞具扁烙..
	if(NULL == StartRoutine) 
	{
		for( i = 0 ; i < m_Def_Workerthread ; i++ )
		{
			m_pWorkerThread[i] = new CMWorkerThread();
			m_pWorkerThread[i]->begin();
			m_iThreadCurrentCnt++;

		}
	}
	else
	{
		for( i = 0 ; i < m_Def_Workerthread ; i++ )
		{
			m_pWorkerThread[i] = new CMWorkerThread(StartRoutine);
			m_pWorkerThread[i]->begin();
			m_iThreadCurrentCnt++;
		}

	}



	//竣剂飘 包府磊甫 积己
	m_pIOAccepter = new CMIocpAccept(iMaxAcceptUser);

	m_ListenSock = m_pIOAccepter->GetListenSocket();

	return true;
}

int CMIocpMudule::SetServerSocket(char *pIP,int iPort)
{
	
	m_pIOAccepter->SetServerAccept(pIP,iPort);

	return 1;
}

INT	CMIocpMudule::GetWorkerThreadSize()
{
	return m_Def_Workerthread;
}

HANDLE CMIocpMudule::GetWorkerIOCPHandle()
{
	return m_hWorkerIOCP;
}

bool CMIocpMudule::AddHandleToIOCP( HANDLE handle, DWORD keyValue )
{
	::CreateIoCompletionPort( handle, m_hWorkerIOCP, keyValue, 0 );

	return true;
}


BOOL CMIocpMudule::SetIPAddress(char * pIPAddress,int iPort)
{
	if(pIPAddress != NULL)
		strcpy(m_pIPAdress,pIPAddress);
	else
	{
		memset(m_pIPAdress,0,sizeof(m_pIPAdress));

	}

    m_iPort = iPort;
	return TRUE;

}

BOOL CMIocpMudule::GetIPAddress(char * pIPAddress,int* iPort)
{
	int size;
	size = strlen(m_pIPAdress);
	if(size == 0)
	{
		return FALSE;
	}

	strcpy(pIPAddress,m_pIPAdress);
    *iPort = m_iPort;
	return TRUE;
}

⌨️ 快捷键说明

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