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

📄 mapserversocket.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		ErrorMsg(TEXT("IOCP create error.. code = %d\n"),GetLastError());
		return FALSE;
	}

	return TRUE;
}



////////////////////////////////////////////////////////////////////////////////////////
//	Network Module Initialize
////////////////////////////////////////////////////////////////////////////////////////
BOOL MapServerSocket::InitializeNetwork(LPSTR pAddress, UINT pPort)
{

	//	--------------------------------------------------------------------------------
	//	Listen Socket Create
	//	--------------------------------------------------------------------------------
	m_SocketListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP,
		NULL, 0, WSA_FLAG_OVERLAPPED);

	if( m_SocketListen == INVALID_SOCKET )
	{
		ErrorMsg(TEXT("WSASocket error. Error code = %d"),WSAGetLastError());
		return FALSE;
	}


	INT nRet = 0;
	SOCKADDR_IN	si_addr;

	//	--------------------------------------------------------------------------------
	//	IP Address & Port且寸
	//	--------------------------------------------------------------------------------
	si_addr.sin_family		= AF_INET;
	si_addr.sin_addr.s_addr = inet_addr( pAddress );
	si_addr.sin_port		= htons(pPort);

	int reuse = 1;

	nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_REUSEADDR, (char FAR *)&reuse, sizeof(int));     
	if (nRet == SOCKET_ERROR) 
	{     
		ErrorMsg( "(X) Reuse addr error" );
	} 
		
	nRet = bind(m_SocketListen, (struct sockaddr *) &si_addr, sizeof(si_addr));

	if(nRet == SOCKET_ERROR)
	{
		ErrorMsg(TEXT("Error bind. Error code = %d"),WSAGetLastError());
		return FALSE;
	}

	nRet = listen(m_SocketListen, SOMAXCONN );
	
	if(nRet == SOCKET_ERROR)
	{
		ErrorMsg(TEXT("Error listen. Error code = %d"),WSAGetLastError());
		return FALSE;
	}


	//	--------------------------------------------------------------------------------
	//	disable send buffering on listen socket.
	//	--------------------------------------------------------------------------------
	int			nZero = 0;
	LINGER		LingerStruct;

	nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_SNDBUF, (char*) &nZero, sizeof(nZero));
	
	if(nRet == SOCKET_ERROR)
	{
		ErrorMsg("ListenSock Option(SO_SNDBUF) Failed: %d\n", WSAGetLastError());	
		return FALSE;
	}

	//	--------------------------------------------------------------------------------
	//	disable recv buffering on listen socket.
	//	--------------------------------------------------------------------------------
	nZero = 0;
	nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_RCVBUF, (char*) &nZero, sizeof(nZero));
	
	if(nRet == SOCKET_ERROR)
	{
		ErrorMsg("ListenSock Option(SO_RCVBUF) Failed: %d\n", WSAGetLastError());	
		return FALSE;
	}

	//	--------------------------------------------------------------------------------
	//	set linger on listen socket(for hard closing).
	//	--------------------------------------------------------------------------------
	LingerStruct.l_onoff  = 1;
	LingerStruct.l_linger = 0;

	nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_LINGER, (char*) &LingerStruct, sizeof(LingerStruct));
	
	if(nRet == SOCKET_ERROR)
	{
		ErrorMsg("ListenSock Option(SO_LINGER) Failed: %d\n", WSAGetLastError());	
		return FALSE;
	}

#ifdef DEF_SECURITYPACKET

	srand( (unsigned)time( NULL ) );
	
	int iSeed = rand() + 1;

	memset(m_sSeed,0x0,40 ) ;
	memset(m_sSeedKey,0x0,20 ) ;

	itoa(iSeed,m_sSeed,10 ) ;
	itoa(iSeed,m_sSeedKey,10 ) ;

	_17Init(iSeed) ;

	CRegCrypt crypt;

	m_iSeedLength = strlen(m_sSeedKey) ;

	crypt.Encrypt(m_sSeedKey,m_iSeedLength)  ;
	

	BYTE *pEncryptString;
	DWORD nEncryptLength;

	gCrypt().EncryptText
				( 
				m_sSeedKey					,	//	EncrpiptSeed
				(BYTE *) m_sSeed				,	//	鞠龋拳等 Seed
				strlen(m_sSeed)			,	//	鞠龋拳等 
				pEncryptString					, 
				nEncryptLength 
				);
	
	memcpy(m_sSeed, pEncryptString, nEncryptLength);
	m_iSeedLength = nEncryptLength ;	

#endif

	return TRUE;
}




////////////////////////////////////////////////////////////////////////////////////////
//	NPC甫 积己 矫糯 
//
//	-	包访 风凭阑 MAP栏肺 捞傈 矫糯
////////////////////////////////////////////////////////////////////////////////////////
//DEL bool MapServerSocket::InitializeNPC()
//DEL {
//DEL 
//DEL 	for ( LIST_VOIDPTR::iterator it = g_pMap->m_LocationNPC.Begin(); it != g_pMap->m_LocationNPC.End(); it++)
//DEL 	{	
//DEL 		_NPC_	*pNPC = (_NPC_ *)*it;
//DEL 		
//DEL 		if( !pNPC )	continue;
//DEL 
//DEL 		NPC *lpNpc = new NPC( pNPC );
//DEL 	}
//DEL 
//DEL 	return true;
//DEL }


////////////////////////////////////////////////////////////////////////////////////////
//	Thread Inistialize
//
//	-	IOCP Work Thread
//	-	Accept Work Thread
//	-	Read Work Thread
//	-	Send Work Thread
////////////////////////////////////////////////////////////////////////////////////////
BOOL MapServerSocket::InitializeThread()
{
	//	--------------------------------------------------------------------------------
	//	IOCP Work Thread
	//	Thread 积己 箭磊俊 林狼窃 
	//	--------------------------------------------------------------------------------
	unsigned			dwThreadID = 0;
    SYSTEM_INFO         systemInfo;
 
    GetSystemInfo(&systemInfo);
	
	//	--------------------------------------------------------------------------------
	//	NOTENOTE: 静饭靛狼 箭磊啊 腹篮芭 鞍酒辑 临看促.
	// 
	//	--------------------------------------------------------------------------------

    m_dwThreadCount = systemInfo.dwNumberOfProcessors ;
	HANDLE hHandle = NULL;


	for (DWORD i = 0;  i < m_dwThreadCount  ; i++) 
	{	 		
		hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_Iocp, 
								this, 0, (unsigned int *)&dwThreadID );
				
		SetThreadPriority( hHandle, THREAD_PRIORITY_ABOVE_NORMAL );		

		if (hHandle == NULL) return false ;
		CloseHandle(hHandle) ;
	}

	//	--------------------------------------------------------------------------------
	//	Accept Work Thread
	//	--------------------------------------------------------------------------------
	hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_Accept, 
								this, 0, (unsigned int *)&dwThreadID );

	if (hHandle == NULL) return false ;
	CloseHandle(hHandle) ;

	//	--------------------------------------------------------------------------------
	//	IO Read CompletedThread Thread
	//	--------------------------------------------------------------------------------
	hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_IOReadCompleted, 
								this, 0, (unsigned int *)&dwThreadID );

	if (hHandle == NULL) return false ;
	CloseHandle(hHandle) ;


	//	--------------------------------------------------------------------------------
	//	Work Tick
	//	--------------------------------------------------------------------------------
	hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_WorkTick, 
								this, 0, (unsigned int *)&dwThreadID );

	if (hHandle == NULL) return false ;
	CloseHandle(hHandle) ;


	return TRUE;
}


////////////////////////////////////////////////////////////////////////////////////////
//	IO俊 荤侩瞪	CONTEXT甫 馆券 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPPER_IO_CONTEXT MapServerSocket::CreateIOContext( _IO_TYPE io )
{
	
	_LPPER_IO_CONTEXT lpIOContext = NULL;

	if(io == WRITE)
	{
		
		//	--------------------------------------------------------------------------------
		//	漂沥 箭磊捞惑 IO荤侩矫 辑滚 DWON矫糯
		//	--------------------------------------------------------------------------------
	#ifndef _DEBUG	

		if( m_pSendIOPool->GetNumInUse() > MAX_SIOCOUNT*10 - 1000 )
		{
			static DWORD dwServerShutdown1 = 0 ;

			// 促款登绰芭搁 肺弊甫 巢变促.
			if(dwServerShutdown1 == 0)
			{
				MapLog("(X) Send IO POOL Full (%d)Server Shoutdown ", _Module.m_nMapSeq ) ;
			}

			if (timeGetTime() - dwServerShutdown1 > 3*1000 ) 
			{
				ErrorMsg( "(X) Send IO POOL Full	Server Shoutdown");
			
				_Module.Handler( SERVICE_CONTROL_STOP );

				dwServerShutdown1 = timeGetTime() ;
			}

		}

	#endif

		lpIOContext = m_pSendIOPool->Alloc();
	}
	else
	{
		//	--------------------------------------------------------------------------------
		//	漂沥 箭磊捞惑 IO荤侩矫 辑滚 DWON矫糯
		//	--------------------------------------------------------------------------------
	#ifndef _DEBUG	


		if( m_pRecvIOPool->GetNumInUse() > MAX_IO_CONTEXT - 500 )
		{
			static DWORD dwServerShutdown2 = 0 ;

			// 促款登绰芭搁 肺弊甫 巢变促.
			if(dwServerShutdown2 == 0)
			{
				MapLog("(X) Recv IO POOL Full (%d) Server Shoutdown ", _Module.m_nMapSeq ) ;
			}

			if (timeGetTime() - dwServerShutdown2 > 3*1000 ) 
			{
				ErrorMsg( "(X) Recv IO POOL Full	Server Shoutdown");
			
				_Module.Handler( SERVICE_CONTROL_STOP );

				dwServerShutdown2 = timeGetTime() ;
			}

		}

	#endif

		lpIOContext = m_pRecvIOPool->Alloc();
	}


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

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

		if (lpIOContext->bIsUse == true)
		{
			ErrorMsg("(X) m_pIOPool->Alloc() error (%d)  !",lpIOContext);
		}
		else
		{
			lpIOContext->bIsUse = true;
		}

		//	2003.08.31 Duke Kim眠啊 - Error Checking
		lpIOContext->dwMagicNum			= MAGIC_NUM;

		lpIOContext->nType =  MAPSOCKET_TYPE  ;
	}
	else
	{
		ErrorMsg("(X) alloc error in CreateIOContext \n");
	}

	

	return lpIOContext;
}



////////////////////////////////////////////////////////////////////////////////////////
//	IO苞访 Packet阑 积己 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPSOCKET_FD MapServerSocket::CreateSocketContext()
{
	_LPSOCKET_FD lpSocketFD =	(_LPSOCKET_FD)g_pMap->Pool_Socket_Pop();

	if(lpSocketFD)
	{ 
		lpSocketFD->socket		=	INVALID_SOCKET;
		lpSocketFD->nIO			=	0;
		lpSocketFD->nSeq		=	0;
		lpSocketFD->bShutdown	=	false ;



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

		lpSocketFD->nSendIO	=	0;

	}
	else
	{
		ErrorMsg("(X) Alloc error in CreateSkt Context");
	}

	return lpSocketFD;
}




////////////////////////////////////////////////////////////////////////////////////////
//	IO	Memory甫 馆券矫糯	
//
//	-	Error Checking风凭阑 八配 饶 昏力 矫糯
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::ReleaseIOContext( _LPPER_IO_CONTEXT lpIOContext )
{

	//	--------------------------------------------------------------------------------
	//	Error Checking ...
	//	--------------------------------------------------------------------------------
	if( !lpIOContext )
	{
		ErrorMsg( "(X) Map : Release IO Contest IS NULL"		);
		return;
	}	

	if( lpIOContext->dwMagicNum	!= MAGIC_NUM )
	{

⌨️ 快捷键说明

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