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

📄 mapserversocket.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		ErrorMsg( "(X) Map : Release IO Contest MEMORY ERROR " );
		return;
	}

	if(  false == lpIOContext->bIsUse )
	{
		ErrorMsg( "(X) Map : Release IO Context NOT USE %d",lpIOContext	);
		return;
	}


	_IO_TYPE io =  lpIOContext->io ;
	
	if( io == WRITE && lpIOContext->lpSocketContext )
	{
		_LPSOCKET_FD pSocketFD = (_LPSOCKET_FD)lpIOContext->lpSocketContext;

		::InterlockedDecrement( (long *) &pSocketFD->nSendIO ) ;

	}

	//	--------------------------------------------------------------------------------
	//	IO	CONTEXT甫 檬扁拳矫糯
	//	--------------------------------------------------------------------------------
	lpIOContext->bIsUse				= false;

	memset( &lpIOContext->ov , 0, sizeof(WSAOVERLAPPED));

	lpIOContext->io					= READ;
	lpIOContext->dwTransBytes		= 0;
	lpIOContext->dwTotalBytes		= 0;
	lpIOContext->lpSocketContext	= NULL;
	lpIOContext->buf[0]				= 0;

	//	--------------------------------------------------------------------------------
	//	MAX老嫐 包访 IO龋免 咯何 犬牢
	//	--------------------------------------------------------------------------------
	if (io == WRITE)
	{
//	#ifndef _DEBUG
//		if( m_pSendIOPool->GetCount() > MAX_SIOCOUNT - 1000 )
//		{
//			ErrorMsg( "(X) Send ReleaseIOContext %d", m_pSendIOPool->GetCount() );
//		}
//	#endif

		m_pSendIOPool->Free( lpIOContext );	
	}
	else
	{
//	#ifndef _DEBUG
//		if( m_pRecvIOPool->GetCount() > MAX_RIOCOUNT - 1000 )
//		{
//			ErrorMsg( "(X) Recv ReleaseIOContext %d", m_pRecvIOPool->GetCount() );
//		}
//	#endif

		m_pRecvIOPool->Free( lpIOContext );	
	}

	lpIOContext = NULL ;

}



////////////////////////////////////////////////////////////////////////////////////////
//	荤侩等 Socket Pool阑 馆券 矫糯		
//
//	-	lpSocketFD = NULL捞 悼累 
//	-	CONNECT_CLOSE老锭绰 Socket阑 Memory俊 历厘 矫糯 
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::ReleaseSocketContext( _LPSOCKET_FD lpSocketFD )
{
	if( !lpSocketFD			)	return;	
	if( lpSocketFD->bClose  )	return;


	lpSocketFD->nSeq		= 0;
	lpSocketFD->nIO			= 0;
	lpSocketFD->bClose		= true ;
	lpSocketFD->bShutdown	= false;	

	if( lpSocketFD->PlayerStatus  == CONNECT_LOGIN )
	{
		ErrorMsg( "(X) Release Socket Error CONNECT LOGIN = %s/%s", lpSocketFD->pPlayer->m_strAccountID, lpSocketFD->pPlayer->m_strPlayerID );
	}

	if( lpSocketFD->PlayerStatus  == CONNECT_START )
	{
		ErrorMsg( "(X) Release Socket Error CONNECT_START = %s/%s", lpSocketFD->pPlayer->m_strAccountID, lpSocketFD->pPlayer->m_strPlayerID );
	}



//	if( lpSocketFD->nSendIO > 0 )
//	{
//		ErrorMsg( "(X)	Push : Map Server Send IO=%d", lpSocketFD->nSendIO );
//	}


	CLOSESOCKET( lpSocketFD->socket );
	
	
	//	--------------------------------------------------------------------------------
	//	Client立加 LIST俊辑 力芭 矫糯
	//	--------------------------------------------------------------------------------
	m_listConnection.RemovePtr( lpSocketFD );		
	
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
	if(m_listHackingConnection.Find(lpSocketFD) != NULL)
		m_listHackingConnection.RemovePtr(lpSocketFD);
#endif
	
	//	--------------------------------------------------------------------------------
	//	Socket Memory甫 馆券 矫糯 	
	//	--------------------------------------------------------------------------------
	if( g_pMap )
	{			
		g_pMap->Pool_Socket_Push( lpSocketFD );		

#if defined(_DEBUG) || defined(DEF_BUGTRACE)
		//	----------------------------------------------------------------------------
		//	立加 Client肮荐 免仿 
		//	----------------------------------------------------------------------------
		CString strMessage;
		strMessage.Format("%d / %d",m_listConnection.GetCount(), g_pMap->Count_Player()	);				
		MessageCount( strMessage );
#endif
	}
}


////////////////////////////////////////////////////////////////////////////////////////
//	WORK	IOCP
//
////////////////////////////////////////////////////////////////////////////////////////


void MapServerSocket::WorkIocp()
{
	BOOL				bSuccess;
	DWORD				dwBytesTransferred;

	LPOVERLAPPED		lpOverlapped;
	_LPPER_IO_CONTEXT	lpMapIOContext;
	_LPSOCKET_FD		lpMapSocketContext;

	_LPPER_BULK_IO_CONTEXT	lpDBIOContext;
	_LPDBSOCKET_FD			lpDBSocketContext;

	void			*	lpSocketContext ;
	_LPWSACORE			lpWSACore		;

	//	--------------------------------------------------------------------------------
	//	IOCP Loop
	//	--------------------------------------------------------------------------------
	while( g_hIOCP )
	{

		bSuccess =	GetQueuedCompletionStatus
					( 
						g_hIOCP							, 
						&dwBytesTransferred				,
						(LPDWORD)&lpSocketContext		, 
						(LPOVERLAPPED *)&lpOverlapped	, 
						INFINITE 
					);

		//	----------------------------------------------------------------------------
		//	橇肺弊伐捞 辆丰 等 版快
		//	----------------------------------------------------------------------------
		if( !_Module.m_bService  ) 
			break;	

		
		if ( lpSocketContext == NULL)
		{
			continue ;
		}

		lpWSACore = CONTAINING_RECORD( lpOverlapped, WSACORE , ov );

		if(lpWSACore->nType == DBSOCKET_TYPE )
		{
			lpDBIOContext	  = CONTAINING_RECORD( lpOverlapped, _PER_BULK_IO_CONTEXT, ov );
			lpDBSocketContext = (_LPDBSOCKET_FD)	lpSocketContext	 ;
		}
		else
		{
			lpMapIOContext	   = CONTAINING_RECORD( lpOverlapped, _PER_IO_CONTEXT, ov );
			lpMapSocketContext = (_LPSOCKET_FD)	lpSocketContext	 ;
		}

		
        if(!bSuccess || (bSuccess && (0 == dwBytesTransferred))) 
		{
			if(lpWSACore->nType == DBSOCKET_TYPE )
			{
				g_lpDBSock->ReConnect( lpDBSocketContext , lpDBIOContext ) ;
				continue;
			}
			else
			{
				CloseClient( lpMapSocketContext , lpMapIOContext );
				continue;
			}
		}
		
		//	----------------------------------------------------------------------------
		//	捞锅 IO 肯丰饶 傈价 / 荐脚茄 bytes荐甫 歹窍绊, 
		//	钮俊 持绊 肯丰等 IO啊 乐澜阑 舅覆.
		//	----------------------------------------------------------------------------

		lpWSACore->lpSocketContext = lpSocketContext;		
		lpWSACore->dwTransBytes	+= dwBytesTransferred;

		
		//	----------------------------------------------------------------------------
		//	IO俊 蝶扼辑 盒府 矫糯 				
		//	READ/WRITE QUEUE蝶肺 备盒 矫糯 		
		//	----------------------------------------------------------------------------
		if(lpWSACore->nType == DBSOCKET_TYPE )
		{

			switch( lpDBIOContext->io )
			{
			case READ : 
				{
					g_lpDBSock->m_listReadCompleted.AddTail( lpDBIOContext );
					SetEvent( g_lpDBSock->m_hReadEventCompleted );												
				}
				break;
			
			case WRITE : 	
				{
					g_lpDBSock->WriteCompleted(lpDBIOContext);
				}
				break;

			default : break;
			}

		}
		else
		{
			switch( lpMapIOContext->io )
			{
			case READ : 
				{
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
					//Jason 2004-08-19-china
					//菩哦阑 罐篮 泅犁 Tick Count甫 咯扁辑 历厘茄促. ReadPacket()俊辑 历厘窍搁
					//菩哦捞 府矫宏 钮俊辑 掘绢柯 矫痢阑 扁废 窍霸 登骨肺...
					InterlockedExchange((LPLONG)&(lpMapIOContext->dwCurrentSpeedTick), timeGetTime());
#endif
					m_listReadCompleted.AddTail( lpMapIOContext );
					SetEvent( m_hReadEventCompleted );												
				}
				break;
			
			case WRITE : 	
				{
					WriteCompleted(lpMapIOContext);
				}
				break;

			default : break;
			}
		}

	}

	//	--------------------------------------------------------------------------------
	//	IOCP Loop捞 厚沥惑 辆丰矫
	//	--------------------------------------------------------------------------------
	if( _Module.m_bService )	ErrorMsg("(X) IOCP Work Thread Terminate ..");
}


////////////////////////////////////////////////////////////////////////////////////////
//	Client 立加 ACCEPT	贸府
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::WorkAccept()
{
	int					ret						= 0;
	int					clientAddrLen			= 0;

	DWORD				dwNumberOfBytesRecvd	= 0;
	DWORD				dwFlags					= 0;
	
	SOCKET				SocketCleintFD			= INVALID_SOCKET; 

	_LPPER_IO_CONTEXT	lpIOContext				= NULL;
	_LPSOCKET_FD		lpSocketFD				= NULL;

	struct sockaddr_in	clientAddr;
	WSABUF				wsaBuf;

	clientAddrLen		= sizeof(clientAddr);


	while( _Module.m_bService )
	{
		//	----------------------------------------------------------------------------
		//	风橇郴 檬扁拳
		//	----------------------------------------------------------------------------
		ret						= 0;
		dwNumberOfBytesRecvd	= 0;
		dwFlags					= 0;


		SocketCleintFD			= INVALID_SOCKET;

		memset( &clientAddr , 0, sizeof(struct sockaddr_in));


		wsaBuf.buf				= NULL;
		wsaBuf.len				= 0;

		lpIOContext				= NULL;
		lpSocketFD				= NULL;

		//	----------------------------------------------------------------------------
		//	Accept
		//	----------------------------------------------------------------------------
		SocketCleintFD = WSAAccept
						(
						m_SocketListen					,
						(struct sockaddr *)&clientAddr	,
						&clientAddrLen					,
						NULL							, 
						0
						);


		if( !_Module.m_bService )		break;	//	橇肺弊伐狼 辆丰

		//	----------------------------------------------------------------------------
		//	荤侩磊啊 呈公 腹篮 版快 促弗 辑滚肺 立加阑 蜡档窃		
		//	----------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
		if( m_listConnection.GetCount() >= (_Module.m_dwMaxUser -5)	)		
#else
		if( m_listConnection.GetCount() >= (MAX_SOCKET_CONTEXT -5)	)		
#endif
		{
			CLOSESOCKET( SocketCleintFD );
			ErrorMsg( "(X) Max Connection Full" );
			continue;
		}
		


		if( SocketCleintFD == INVALID_SOCKET ) 
		{
			ErrorMsg("(X) Error WSAAccept, Error code = %d",WSAGetLastError() );
			break;
		}


		lpSocketFD = CreateSocketContext();

		if( !lpSocketFD ) 
		{
			ErrorMsg("(X) Error memory allocate 1");
			break;
		}
		
		//	----------------------------------------------------------------------------
		//	Default 2矫埃 饶 Connection Close啊  牢瘤凳 
		//	----------------------------------------------------------------------------

		DWORD tmp;
		tcp_keepalive keepAlive = { TRUE, 10000, 1000 };
		
		WSAIoctl( lpSocketFD->socket, SIO_KEEPALIVE_VALS, &keepAlive, sizeof( keepAlive ),	0, 0, &tmp, NULL, NULL );

		lpIOContext = CreateIOContext(READ);
		
		if( !lpIOContext ) 
		{
			ErrorMsg("(X) Error memory allocate 2");
			break;
		}



		g_hIOCP =	CreateIoCompletionPort
					( 
						(HANDLE)SocketCleintFD	, 
						g_hIOCP					, 
						(DWORD)lpSocketFD		, 
						0
					);
		

		if( !g_hIOCP ) 
		{
			ErrorMsg( "(X) WorkAccept : Error CreateIoCompletionPort, Error code = %d\n",GetLastError() );
			break;
		} 

		//	----------------------------------------------------------------------------
		//	秦寸 Player狼 扁夯 沥焊甫 Setting矫糯 
		//
		//	-	Socket FD积己 

⌨️ 快捷键说明

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