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

📄 dbsocket.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 
    GetSystemInfo(&systemInfo);
    //	m_dwThreadCount = systemInfo.dwNumberOfProcessors * 2;
    m_dwThreadCount	= MAX_DBSOCKET_WORKER_THREAD;

	HANDLE hHandle = NULL ;

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

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




////////////////////////////////////////////////////////////////////////////////////////
//	World Server俊 单捞鸥 傈价
//
//	- 傈价 PACKET阑 罐酒辑 MAIN Connection俊 单捞鸥 傈价 
//	- SERVER MODE牢 版快 
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bSend(_LPDBPACKET lpDbPacket ) 
{	
	//
	//	World Server客 DISCONNECT惑怕牢 版快 QUEUE俊 历厘
	//
	if(  _Module.m_ServerStatus	== SERVER_DISCONNECTWORLD)
	{		
		//	m_RecoveryList.AddTail( lpDbPacket );
		g_pServerMem->WorldPacket_Push( lpDbPacket );

		return false;
	}
	
	_LPPER_BULK_IO_CONTEXT lpSendIOContext = NULL;				
	lpSendIOContext = CreateIOContext(WRITE);
							
	//	--------------------------------------------------------------------------------
	// NOTENOTE: 菩哦 鞠龋拳 
	//	--------------------------------------------------------------------------------

	lpDbPacket->dwSeq = 1  ;
	lpDbPacket->wCheckSum = PacketEncrypt(lpDbPacket->strPacket, lpDbPacket->dwSize, lpDbPacket->dwSeq&31) ;
	lpDbPacket->dwSize	 += DBPACKETHEADER_SIZE;

#ifdef DEF_KUMA_CHECK_PACKET
	if ( lpDbPacket->dwSize >= MAX_BULKBUF_SIZE )
	{
		char cMsg[200] ;
		wsprintf(cMsg,"(X) bSend Error SIZE(%d) CMD(%d) CS(%d)",lpDbPacket->dwSize,lpDbPacket->dwCommand,lpDbPacket->wCheckSum) ;
		ErrorMsg( cMsg );
		g_pServerMem->WorldPacket_Push( lpDbPacket );
		return false;
	}
#endif

	if( lpSendIOContext )
	{
		memcpy( lpSendIOContext->buf , lpDbPacket, lpDbPacket->dwSize );
		lpSendIOContext->dwTotalBytes = lpDbPacket->dwSize ;

		lpSendIOContext->lpSocketContext = m_SocketFD[ m_nNowSocketNum ];


		WriteCompleted( lpSendIOContext) ;	
	}
	else
	{
		int x = 1;
	}

	g_pServerMem->WorldPacket_Push( lpDbPacket );


	return true ;
}


////////////////////////////////////////////////////////////////////////////////////////
//	World Server俊 单捞鸥 傈价
//
//	- 傈价 PACKET阑 罐酒辑 漂沥 Connection俊 单捞鸥 傈价 
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bSend(_LPDBPACKET lpDbPacket, int pNum )
{
	_LPPER_BULK_IO_CONTEXT lpSendIOContext = NULL;				
	lpSendIOContext = CreateIOContext(WRITE);
								
	TRACE("(O) 2 (%d) [%s]\n",lpDbPacket->dwCommand, lpDbPacket->strPacket);

	//	--------------------------------------------------------------------------------
	//	 NOTENOTE: 菩哦 鞠龋拳 
	//	--------------------------------------------------------------------------------

	lpDbPacket->dwSeq = 1  ;
	lpDbPacket->wCheckSum = PacketEncrypt(lpDbPacket->strPacket, lpDbPacket->dwSize, lpDbPacket->dwSeq&31) ;
	lpDbPacket->dwSize	 += DBPACKETHEADER_SIZE;

	if( lpSendIOContext )
	{
		memcpy( lpSendIOContext->buf , lpDbPacket, lpDbPacket->dwSize );
		lpSendIOContext->dwTotalBytes = lpDbPacket->dwSize ;

		lpSendIOContext->lpSocketContext = m_SocketFD[ pNum ];	//	漂沥 Connection俊 傈价 


		WriteCompleted( lpSendIOContext) ;	
	}


	g_pServerMem->WorldPacket_Push( lpDbPacket );

	return true ;
}



////////////////////////////////////////////////////////////////////////////////////////
//	World Server Connect 风凭 
//	
//	-	RECONNECT矫 MEMORY眉农
//	-	促矫 立加 矫档 矫 -> Send俊 角菩茄 沥焊甫 啊瘤绊 乐澜 
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bConnect( int pNum, bool pReconnect )
{
	//
	//	Listen Socket Create
	//
	m_Socket[pNum] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP,	NULL, 0, WSA_FLAG_OVERLAPPED);

	if( m_Socket[pNum] == INVALID_SOCKET )
	{
		ErrorMsg( "WSASocket error. Error code = %d",WSAGetLastError() );
		
		m_bSocketStatus[ pNum ]	= false;
		return false;
	}
		
			
	INT nRet = 0;
	SOCKADDR_IN	si_addr;

	// 家南阑 稠喉废欧 葛靛肺 
	u_long          arg;
	arg = 1;
	ioctlsocket(m_Socket[pNum], FIONBIO, &arg);

	//
	//	IP Address & Port且寸
	//
	si_addr.sin_family		= AF_INET;
	si_addr.sin_addr.s_addr = inet_addr( _Module.m_szWorldIP );		
	si_addr.sin_port		= htons( _Module.m_nWorldPORT );

		

	nRet = connect(m_Socket[pNum], (struct sockaddr *) &si_addr, sizeof(si_addr));

	if (nRet == SOCKET_ERROR) 
	{
		if (WSAGetLastError() != WSAEWOULDBLOCK) 
		{
			nRet = WSAGetLastError();

			m_bSocketStatus[ pNum ]	= false;
			return FALSE;
		}
	}


	DWORD dwOpt ;

	// 家南 可记阑 炼沥茄促. 
	dwOpt = 8192*5;
	setsockopt(m_Socket[pNum], SOL_SOCKET, SO_RCVBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
	setsockopt(m_Socket[pNum], SOL_SOCKET, SO_SNDBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));


	//
	//	Socket Connection POOL荤侩
	//
	m_SocketFD[pNum] = NULL ;
	m_SocketFD[pNum] = CreateSocketContext();

	
	if( !m_SocketFD ) 
	{
		ErrorMsg("Error memory allocate 1");
		m_bSocketStatus[ pNum ]	= false;
		return false ;
	}

	_LPPER_BULK_IO_CONTEXT	lpIOContext			= NULL;

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


	//
	//	漂沥 矫埃	Wating (3Sec)
	//
	HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL );		
	if( hEvent )	WaitForSingleObject( hEvent, 3000 );	// 3000ms 父怒 Sleep矫糯 	
	CLOSEHANDLE( hEvent );	

	g_hIOCP = CreateIoCompletionPort( (HANDLE)m_Socket[pNum], g_hIOCP, (DWORD)m_SocketFD[pNum], 0);

	m_SocketFD[pNum]->socket			= m_Socket[pNum];	// Sokcet ID		
	m_SocketFD[pNum]->clientAddr		= si_addr ;			// Client IP Struct	
	m_SocketFD[pNum]->bClose			= false;
	
	
	WSABUF	wsaBuf;
	wsaBuf.buf = lpIOContext->buf;
	wsaBuf.len = MAX_BULKBUF_SIZE;

	DWORD				dwNumberOfBytesRecvd= 0;
	DWORD				dwFlags				= 0;

	lpIOContext->lpSocketContext = m_SocketFD[pNum];

	int ret ;
	ret =	WSARecv	(
					m_SocketFD[pNum]->socket	,
					&(wsaBuf)					, 
					1							, 
					&dwNumberOfBytesRecvd		, 
					&dwFlags					, 
					(LPWSAOVERLAPPED)lpIOContext, 
					NULL
					);

	if( ret == SOCKET_ERROR )
	{			
		if( WSAGetLastError() != ERROR_IO_PENDING )
		{
			ErrorMsg( "(X) Word Socket Error Code=%d IP=%s PORT=%d",WSAGetLastError(), _Module.m_szWorldIP, _Module.m_nWorldPORT );

			CloseClient(m_SocketFD[pNum], lpIOContext );
			
			m_bSocketStatus[ pNum ]	= false;
			return false;
		}
	}	



	m_bSocketStatus[ pNum ]	= true;


	// 甘辑滚 沥焊甫 焊辰促. 
	WorldSend_MapInfor(pNum) ;

	//	MAP	SERVER Heart Pulse 傈价
	//	g_pServer->World_MapHeartPulse();

	return true;
}



////////////////////////////////////////////////////////////////////////////////////////
//	I/O	CONTEXT	且寸
//
////////////////////////////////////////////////////////////////////////////////////////
_LPPER_BULK_IO_CONTEXT DBSocket::CreateIOContext(_IO_TYPE io)
{
	_LPPER_BULK_IO_CONTEXT lpIOContext = NULL;

	lpIOContext = m_pWorldIOPool->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;

		lpIOContext->bIsUse				= true;
		
		//	2003.08.31 Duke Kim 坷幅 贸府 Code眠啊
		lpIOContext->dwMagicNum			=	MAGIC_NUM;

		lpIOContext->nType =  DBSOCKET_TYPE  ;


	}
	else
	{
		ErrorMsg("alloc error in CreateIOContext _PER_BULK_IO_CONTEXT \n");
	}


	return lpIOContext;
}



////////////////////////////////////////////////////////////////////////////////////////
//	Socket Context甫 窍唱 且寸 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPDBSOCKET_FD DBSocket::CreateSocketContext()
{
	_LPDBSOCKET_FD lpSktContext = NULL;

	lpSktContext = (_DBSOCKET_FD *)SocketPool_Pop();	
					
	if(lpSktContext)
	{ 
		lpSktContext->nIO			= 0;
		lpSktContext->socket		= INVALID_SOCKET;

	}else
	{
		TRACE("alloc error in CreateSktContext\n");
	}

	return lpSktContext;
}



////////////////////////////////////////////////////////////////////////////////////////
//	
//	2003.08.30	memset俊辑 memory坷幅 惯积
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReleaseIOContext( _LPPER_BULK_IO_CONTEXT lpIOContext )
{
	//	--------------------------------------------------------------------------------
	//	Error Checking ...
	//	--------------------------------------------------------------------------------
	if( !lpIOContext )
	{
		ErrorMsg( "(X) World : Release IO Contest IS NULL"		);
		return;
	}	

	if( lpIOContext->dwMagicNum	!= MAGIC_NUM )
	{
		ErrorMsg( "(X) World : Release IO Contest MEMORY ERROR " );
		return;
	}

	if( !lpIOContext->bIsUse )
	{
		ErrorMsg( "(X) World : Release IO Context NOT USE" );
		return;
	}

	//	--------------------------------------------------------------------------------
	//	秦寸 IO	CONTEXT甫 馆券 矫糯
	//	
	//	-	酒贰狼 檬扁拳 风凭狼 鞘夸 咯何 CHECKING
	//	--------------------------------------------------------------------------------

	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;


	m_pWorldIOPool->Free(lpIOContext);

	
	lpIOContext = NULL;
}


////////////////////////////////////////////////////////////////////////////////////////
//	荤侩等 Socket Pool阑 馆券 矫糯		
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReleaseSocketContext(_LPDBSOCKET_FD lpSktContext)
{

	if(lpSktContext)
	{

		if( !lpSktContext->bClose )
		{
			/* 
			memset(lpSktContext, 0x00, sizeof(_DBSOCKET_FD)) ;

			memset( lpSktContext->szAccountId ,0x00, sizeof( lpSktContext->szAccountId ) );
			memset( lpSktContext->szPlayerId  ,0x00, sizeof( lpSktContext->szPlayerId  )	);
			
			lpSktContext->wServerGroupID	= 0;
			lpSktContext->wMapGroupID		= 0;
			lpSktContext->wMapID			= 0;*/

			lpSktContext->nIO				= 0;
			CLOSESOCKET(lpSktContext->socket);
			lpSktContext->bClose			= true;

			SocketPool_Push( lpSktContext );
		}


	}else{
		TRACE("release but that is NULL in ReleaseSktContext \n");
	}
}


////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReConnect(_LPDBSOCKET_FD lpSocketContext ,_LPPER_BULK_IO_CONTEXT  lpIOContext )
{

//	楷搬捞 Close等 World Socket阑 锅龋甫 茫澜
	int nTempNum;

	for( int i=0; i<MAX_WORLD_SOCKET; i ++ )
	{
		if(m_Socket[i] == lpSocketContext->socket)
		{

⌨️ 快捷键说明

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