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

📄 cmicopaccept.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <MatrixCore/Network/CMOverlapped.h>
#include <MatrixCore/Network/CMserverSocket.h>

#include "CMIocpAccept.h"
#include "CMIocpMudule.h"
//#include ".\MatrixCore\System\CMDebug.h"
#include <MatrixCore/Pattern/CMSingleton.h>
#include <MatrixCore/Network/CMInetAddress.h>

using namespace MatrixCore::Pattern;
using namespace MatrixCore::Network;
using namespace MatrixCore::System;


//CMDebug *pAcceptDebug = NULL;

CMIocpAccept::CMIocpAccept(int iMax_User) 
:dwCntID(10000),m_iMaxUser(DEF_MAXUSERSOCKET)
{
	WSADATA wsaData;
	char IPstr[16];
	int iPort;

//	pAcceptDebug = new CMDebug(MatrixCore::System::CMDebug::DEBUGTYPE_FILE,"Err/AcceptSocketErr");
	m_pSerAcceptSock	= NULL;
	m_pClientAcceptSock = new CMServerSocket;

	// 撅剂飘 蜡历 箭磊 绊沥.
	SetMaxUser(iMax_User);
	
	//泅犁 哪腔磐 酒捞乔, 器飘锅龋 5555, 府胶醋喉钒 SOMAXCONN 5
	if(CMIocpMudule::GetInstance()->GetIPAddress(IPstr,&iPort))
	{
		m_pClientAcceptSock->Initialize(IPstr,iPort,5);
	}
	else
	{
		m_pClientAcceptSock->Initialize(5555,SOMAXCONN );
	}



	m_ListenSock = m_pClientAcceptSock->GetListenSocket();
	//扩加 2.0滚怜 荤侩
	if( ::WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) != 0 )
		return ;

	if( wsaData.wVersion != MAKEWORD( 2, 2 ) )
	{
		::WSACleanup();

		return ;
	}

	for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
	{
		//坷滚乏 备炼眉 劝寸
		m_pServOverlapped[i] = NULL;
	}

	for (int i = 0; i < m_iMaxUser; i++ )
	{
		//坷滚乏 备炼眉 劝寸
		m_pClientOverlapped[i] = NULL;
		m_pClientOverlapped[i] = new CMOVERLAPPED;
		m_pClientOverlapped[i]->pRecvContext = NULL;
		m_pClientOverlapped[i]->pRecvContext = new RECVIOCONTEXT;

		// 坷滚乏 备炼眉 撅剂飘侩栏肺 汲沥.
		m_pClientOverlapped[i]->eState = eACCEPT;
		m_pClientOverlapped[i]->iAcceptServer = eClient;
		m_pClientOverlapped[i]->sOverlappedID = i;
		//		o->ix = ovl.size();

		//Accept家南俊 滚欺甫 吧绢 初绰累诀阑 茄促.
		AcceptContext( *m_pClientOverlapped[i] );	
		if ( m_pClientOverlapped[i]->s != INVALID_SOCKET )
			ovl.push_back( m_pClientOverlapped[i] );
		else
		{
			//家南 劝寸 角菩
			int err = GetLastError();
			CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptContext() Error(%d)",__FILE__,__LINE__,err);
		}
	}



	
	if(0 == CreateIoCompletionPort( (HANDLE) m_pClientAcceptSock->GetListenSocket()
		, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(), 0, 0 ))
	{
		int err = GetLastError();
		CMSingleton<CMDebug>::getInstance()->output("%s(%d)CreateIoCompletionPort() Error(%d)",__FILE__,__LINE__,err);
	}
}

CMIocpAccept::~CMIocpAccept()
{
	list <CMOVERLAPPED * >::iterator Iter;
//	CMOVERLAPPED *pOV;
	WSACleanup();
	
	//for ( Iter = ovl.begin( ); Iter != ovl.end( ); Iter++ )
	//{
	//	pOV = *Iter;
	//	delete pOV->pRecvContext;
	//	delete pOV;
	//}

	for (int i = 0; i < m_iMaxUser; i++ )
	{
		if(m_pClientOverlapped[i] != NULL)
		{
			if(m_pClientOverlapped[i]->pRecvContext != NULL)
			{
				delete m_pClientOverlapped[i]->pRecvContext;
				m_pClientOverlapped[i]->pRecvContext = NULL;
			}

			delete m_pClientOverlapped[i];
			m_pClientOverlapped[i] = NULL;
		}
	}

	for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
	{
		if(m_pServOverlapped[i] != NULL)
		{
			if(m_pServOverlapped[i]->pRecvContext != NULL)
			{
				delete m_pServOverlapped[i]->pRecvContext;
				m_pServOverlapped[i]->pRecvContext = NULL;
			}

			delete m_pServOverlapped[i];
			m_pServOverlapped[i] = NULL;
		}
	}

	if(m_pClientAcceptSock != NULL)
		delete m_pClientAcceptSock;

	if(m_pSerAcceptSock != NULL)
		delete m_pSerAcceptSock;

	//if(pAcceptDebug != NULL)
	//	delete pAcceptDebug;
//	ovl.clear();
}

void CMIocpAccept::SetMaxUser(int iMax_User)
{
	if(iMax_User >= DEF_MAXUSERSOCKET || iMax_User <= 0)
		m_iMaxUser = DEF_MAXUSERSOCKET;
	else
        m_iMaxUser = iMax_User;
}

//-------------------------------------------------------------------------------------------------------
//	Name		 :: void AcceptContext( CMOVERLAPPED &ov )
//	Create Date	 :: 2004/01/12
//	Description	 ::	撅剂飘 家南阑 窍唱 劝寸饶 坷滚乏 备炼眉 檬扁拳. 弊府绊 竣剂飘 家南阑 吧绢 霖促.
//	param		 ::	
//			CMOVERLAPPED &ov		:	OVERLAPPED 备炼眉.
//	Return Value :: void 鸥涝
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
void CMIocpAccept::AcceptContext( CMOVERLAPPED &ov ,SOCKET sockListen)
{
	int zero = 0;
	int iErr = 0;

	ov.s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
	if ( ov.s != INVALID_SOCKET )
	{
		// 备炼眉 檬扁拳.
		ov.InitOverLapped();

		//	荤侩磊付促 罚待 绊蜡 酒捞叼 何咯..
		ov.dwRandomID = InterlockedIncrement(&dwCntID);
		
		setsockopt( ov.s, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof zero );
		setsockopt( ov.s, SOL_SOCKET, SO_RCVBUF, (char *) &zero, sizeof zero );

		memset( ov.pRecvContext->AcceptBuf, '\0', sizeof ov.pRecvContext->AcceptBuf );
		memset( ov.pRecvContext->RecvBuf , 0 , sizeof ov.pRecvContext->RecvBuf );

	
		
		if(eServer != ov.iAcceptServer)
		{
			ov.iAcceptServer = eClient;
			// 努扼捞攫飘螟 荤侩磊 竣剂飘甫 扒促.
			if ( ! AcceptEx( m_pClientAcceptSock->GetListenSocket(), ov.s, &ov.pRecvContext->AcceptBuf[0],
				/*CMOVERLAPPED::initialReceiveSize*/0, ov.addrlen,
				ov.addrlen, 0, &ov ) )
			{
				// AcceptEx() returned FALSE, check for real errors
				iErr = GetLastError();
				if ( iErr != ERROR_IO_PENDING )
				{
					//listen 家南 角菩..
					int err = GetLastError();
					CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptEx() Error(%d)",__FILE__,__LINE__,err);
				}
			}
		}
		else
		{
			// 辑滚螟 荤侩磊 竣剂飘甫 扒促.
			if ( ! AcceptEx( m_pSerAcceptSock->GetListenSocket(), ov.s, &ov.pRecvContext->AcceptBuf[0],
				/*CMOVERLAPPED::initialReceiveSize*/0, ov.addrlen,
				ov.addrlen, 0, &ov ) )
			{
				// AcceptEx() returned FALSE, check for real errors
				if ( GetLastError() != ERROR_IO_PENDING )
				{
					//listen 家南 角菩..
					int err = GetLastError();
					CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptEx() Error(%d)",__FILE__,__LINE__,err);
				}
			}
		}
	}
	else
	{
		//Socket Creation 角菩
		int err = GetLastError();
		CMSingleton<CMDebug>::getInstance()->output("%s(%d)Socket Creation Error(%d)",__FILE__,__LINE__,err);
	}

}




void CMIocpAccept::SetServerAccept(char * pIP, int iPort)
{
	m_pSerAcceptSock = new CMServerSocket;


	if(pIP == NULL)
		m_pSerAcceptSock->Initialize(CMInetAddress::GetHostAddress(),iPort,SOMAXCONN);
	else
		m_pSerAcceptSock->Initialize(pIP,iPort,SOMAXCONN);


	for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
	{
		//坷滚乏 备炼眉 劝寸
		m_pServOverlapped[i] = NULL;
		m_pServOverlapped[i] = new CMOVERLAPPED;
		m_pServOverlapped[i]->pRecvContext = NULL;
		m_pServOverlapped[i]->pRecvContext = new RECVIOCONTEXT;

		// 坷滚乏 备炼眉 撅剂飘侩栏肺 汲沥.
		m_pServOverlapped[i]->eState = eACCEPT;
		
		m_pServOverlapped[i]->iAcceptServer = eServer;
		m_pServOverlapped[i]->sOverlappedID = i;
		//		o->ix = ovl.size();

		//Accept家南俊 滚欺甫 吧绢 初绰累诀阑 茄促.
		AcceptContext( *m_pServOverlapped[i],m_pSerAcceptSock->GetListenSocket() );	
		if ( m_pServOverlapped[i]->s != INVALID_SOCKET )
			ovl.push_back( m_pServOverlapped[i] );
		else
		{
			//家南 劝寸 角菩
			int err = GetLastError();
			CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptContext() Error(%d)",__FILE__,__LINE__,err);
		}
	}


	if(0 == CreateIoCompletionPort( (HANDLE) m_pSerAcceptSock->GetListenSocket()
		, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(), 0, 0 ))
	{
		int err = GetLastError();
		CMSingleton<CMDebug>::getInstance()->output("%s(%d)CreateIoCompletionPort() Error(%d)",__FILE__,__LINE__,err);
	}
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////
//	积己磊 & 家戈磊
///////////////////////////////////////////////////////////////////////////////////////////////////////////
CMMemoryManager::CMMemoryManager(INT iBuffMaxSize)

⌨️ 快捷键说明

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