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

📄 dbsocket.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			nTempNum			= i;
			m_bSocketStatus[i]	= false;
			break;
		}
	}

	TRACE("remote is close \n" );
	CloseClient( lpSocketContext , lpIOContext );
	
				
	if( nTempNum >= MAX_WORLD_SOCKET	) return;	//	Close等 Socket阑 茫瘤 给窍绰 版快 			
	if( !_Module.m_bService				) return;	//	辑厚胶 吝瘤	
	

	///////////////////////////////////////////////////////////////////			
	//	泅犁 荤侩吝牢 Socket捞 Close等 版快 促澜 Connection栏肺 捞悼 矫糯
	//	(促澜 Socket捞 Close等 版快 促澜 Socket栏肺 捞悼 矫糯)
	///////////////////////////////////////////////////////////////////
	int nTempNextNum;
	
	if( nTempNum == m_nNowSocketNum )
	{	

		nTempNextNum = nTempNum;
		
		for( int i=0; i < MAX_WORLD_SOCKET; i ++ )
		{
			nTempNextNum ++;

			if( nTempNextNum >= MAX_WORLD_SOCKET )
				nTempNextNum = 0;
			
			if( m_bSocketStatus[ nTempNextNum ] )
			{
				m_nNowSocketNum = nTempNextNum;
				
				ErrorMsg( "[%d] World Socket Move",m_nNowSocketNum);

				break;
			}
		}

		///////////////////////////////////////////////////////////////////
		//	葛电 World Server Socket捞 Close等 版快
		//
		//	-	WORLD SERVER立加 矫档 
		///////////////////////////////////////////////////////////////////
		if( i >= MAX_WORLD_SOCKET )
		{
			
			_Module.m_ServerStatus	=	SERVER_DISCONNECTWORLD;	//	DISCONNECT	MODE
			
			//	秦寸 World Server Socket汗备
			for( i=0; i < MAX_WORLD_SOCKET; i ++ )
			{						
				int bReturn = false;

				while( !bReturn )
				{
					ErrorMsg( "(X) %d WORD SOCKET Reconnect" , i  );

					bReturn = bConnect( i, true );
				}	
			}
			
			_Module.m_ServerStatus	=	SERVER_START;			//	START MODE
		}

	}

}



////////////////////////////////////////////////////////////////////////////////////////
// IO窍唱甫 付闷芭唱, SOCKET ERROR 老版快
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::CloseClient(_LPDBSOCKET_FD lpSktContext, _LPPER_BULK_IO_CONTEXT lpIOContext )
{

	ReleaseIOContext( lpIOContext );

	//	--------------------------------------------------------------------------------
	//	SOCKET ERROR老 锭.. 家南阑 close窍绊, 措扁吝牢 葛电 IO狼 fail 蜡档茄促.
	//	bGraceful 捞 FALSE 捞搁 , error芭唱, remote close扼绊 魄窜茄促.
	//  bGraceful 捞 TRUE 捞搁 , 秦寸 IO甫 肋 付闷促绊 魄窜茄促.
	//	--------------------------------------------------------------------------------
	if( lpSktContext && lpSktContext->socket != INVALID_SOCKET )
	{
		LINGER LingerStruct;
		LingerStruct.l_onoff  = 1;
		LingerStruct.l_linger = 0;

		setsockopt(lpSktContext->socket, SOL_SOCKET, SO_LINGER,(char*)&LingerStruct, sizeof(LingerStruct));

		CLOSESOCKET( lpSktContext->socket );

		TRACE("closesocket\n");
	}

	ReleaseSocketContext(lpSktContext) ;
}


////////////////////////////////////////////////////////////////////////////////////////
//	Read Packet 
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::WorkReadCompleted()
{	
	TRACE("Read Completed start ......\n");
	
	INT						ret;
	DWORD					dwFlags;
	DWORD					dwNumberOfBytesRecvd;

	_LPPER_BULK_IO_CONTEXT		lpIOContext;
	_LPPER_BULK_IO_CONTEXT		lpPrevIOContext;

	_LPDBSOCKET_FD			lpSktContext;

	WSABUF					wsaTmp;
	BOOL					bIOComplete;

	char					buf[MAX_BULKBUF_SIZE];


	while( _Module.m_bService )
	{
		ret						= 0; 
		dwFlags					= 0;
		dwNumberOfBytesRecvd	= 0;

		lpIOContext				= NULL;		
		lpPrevIOContext			= NULL;
		lpSktContext			= NULL;

		wsaTmp.buf				= NULL;
		wsaTmp.len				= 0;
		bIOComplete				= 0;


		// list 绝澜 措扁
		if(m_listReadCompleted.IsEmpty())	
			WaitForSingleObject (m_hReadEventCompleted,INFINITE);
	
		if( !_Module.m_bService )			break;			// 橇肺弊伐 辆丰
		
		if(m_listReadCompleted.IsEmpty())	continue;		// 促矫 list 八刘


		lpIOContext = (_LPPER_BULK_IO_CONTEXT)m_listReadCompleted.RemoveHead();
		
		if( lpIOContext == NULL)
		{
			ErrorMsg("IO context is NULL. in WorkIOCompleted\n");
			continue;
		}


		// INVALID_SOCKET 捞扼搁, 钮俊 历厘登绢 乐绰 惑炔俊辑 促弗 Thread俊辑 IO甫 柳青窍促啊 
		// 秦寸 remote socket捞 close登菌芭唱 socket error啊 惯积窍咯 捞固 closesocket甫 秦 滚赴 版快
		// 弊摹父, WRITE 老锭 remote socket捞 罐绊 唱辑 官肺 谗绢 滚府绰 版快档 瞪荐 乐促.

		lpSktContext = (_LPDBSOCKET_FD)lpIOContext->lpSocketContext;

		if( lpSktContext == NULL )
		{
			ErrorMsg("socket context is NULL. in WorkIOCompleted\n");
			ReleaseIOContext(lpIOContext);
			continue;
		}

		if( lpSktContext->socket == INVALID_SOCKET )
		{
			TRACE("socket is INVALID_SOCKET. in WorkIOCompleted\n");
			CloseClient( lpSktContext, lpIOContext  );
			continue;
		}


RETRY:	// Recv 俊辑 菩哦阑 2俺 捞惑 罐疽阑锭 促矫 倒酒 柯促.


		/*	------------------------------------------------------------
			recv矫 绊妨 荤亲
			1. 菩哦甫 促 罐瘤 给茄 惑怕 -> 捞绢 罐扁
			2. 茄锅俊 滴俺 捞惑狼 菩哦阑 罐篮 版快 -> 盒府 -> 捞绢罐扁
		-------------------------------------------------------------- */
		if(  lpIOContext->io  == READ )
		{


			/*
				捞绢 罐扁 packet捞衬? 梅 罐篮 packet捞衬?	
				梅浚 0蔼阑 啊瘤绊 乐促.
			*/
			if( lpIOContext->dwTotalBytes == 0 )									
			{

				// DWORD 捞惑篮 罐疽促.
				if( lpIOContext->dwTransBytes >= sizeof(WORD) )
				{					
					// 弊法促搁, Packet狼 total 荤捞令 历厘
					lpIOContext->dwTotalBytes = *(WORD*)&(lpIOContext->buf[0]);	
					

					// total 荤捞令啊 MAX_BULKBUF_SIZE 焊促 农促 --; 捞繁 朝涵遏捞			
					if( lpIOContext->dwTotalBytes >= MAX_BULKBUF_SIZE )
					{
#ifdef DEF_KUMA_CHECK_PACKET
						WORD _wCmd = *(WORD*)&(lpIOContext->buf[2]);
						ErrorMsg("(X)World : Recv. Total packet size over %d, %d CMD(%d)\n", lpIOContext->dwTotalBytes, MAX_BULKBUF_SIZE, _wCmd  );					
#else
						ErrorMsg("(X)World : Recv. Total packet size over %d, %d\n", lpIOContext->dwTotalBytes, MAX_BULKBUF_SIZE  );					
#endif

						lpIOContext->dwTotalBytes = lpIOContext->dwTransBytes;		// 泅犁 荐脚茄 父怒栏肺 力茄茄促.
					}
				}
				else																// 霉 DWORD 滴 给 罐疽促.. --;
				{
					wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes;		// 捞饶何磐 罐霸 茄促.
					wsaTmp.len = MAX_BULKBUF_SIZE - lpIOContext->dwTransBytes;			// 酒流 dwTotalBytes绰 0 捞促.
				}

			}


		//  Total 荤捞令 父怒 促 罐疽唱?
		if( lpIOContext->dwTotalBytes > 0 )
		{

			if( lpIOContext->dwTransBytes < lpIOContext->dwTotalBytes )		// 捞锅 菩哦阑 促 罐瘤 给沁促.
			{
				wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes;		// 捞饶何磐 罐霸 秦具瘤.. 
				wsaTmp.len = lpIOContext->dwTotalBytes - lpIOContext->dwTransBytes;	// 倔付甫 歹 罐酒具 窍绰瘤 舅妨 拎具瘤.. 

			}
			else if( lpIOContext->dwTransBytes > lpIOContext->dwTotalBytes )		// 歹 罐疽尺~
			{
				lpPrevIOContext = CreateIOContext(READ);

				if(lpPrevIOContext)
				{

					lpPrevIOContext->dwTotalBytes = lpIOContext->dwTotalBytes;
					lpPrevIOContext->dwTransBytes = lpIOContext->dwTotalBytes;

					memcpy( lpPrevIOContext->buf ,lpIOContext->buf , lpIOContext->dwTransBytes) ;
					lpPrevIOContext->lpSocketContext = lpSktContext;


					ReadPacket( lpPrevIOContext );

					lpIOContext->dwTransBytes -= lpIOContext->dwTotalBytes;
					memcpy( buf , lpIOContext->buf + lpIOContext->dwTotalBytes , lpIOContext->dwTransBytes );
					
					lpIOContext->dwTotalBytes = 0;
					memcpy( lpIOContext->buf , buf , lpIOContext->dwTransBytes );

					goto RETRY;
				}
			}
			else
			{
				bIOComplete = 1;			// 促 罐疽促. ^^
			}
		}


		
		if( bIOComplete )
		{

			ReadPacket( lpIOContext);			// 促 罐疽栏搁 recved 肺 啊辑 贸府窍绊


			lpIOContext = CreateIOContext(READ);		// 货肺款 IO甫 且寸罐酒辑 促矫 措扁 矫挪促.
			
			if( lpIOContext )
			{			
				wsaTmp.buf = lpIOContext->buf;
				wsaTmp.len = MAX_BULKBUF_SIZE;			
			}
			else
			{
				ErrorMsg("(X) World : IO context alloc error POOL=%d. in WorkIOCompleted()", m_pWorldIOPool->GetCount() );

				wsaTmp.buf = NULL;
				wsaTmp.len = 0;

				break;
			}
		}

		//------------------------------------------------------------------------------------------------------------------
		// io count狼 刘啊客 WSARecv(..) call篮 概莫登绢具 茄促.


			
		ret = WSARecv(lpSktContext->socket,&wsaTmp, 1, &dwNumberOfBytesRecvd, &dwFlags, (LPWSAOVERLAPPED)lpIOContext, NULL);

		//------------------------------------------------------------------------------------------------------------------

			if( ret == SOCKET_ERROR  && ( WSAGetLastError() != ERROR_IO_PENDING))
			{
				ErrorMsg( "(X) 2. DB Error WSARecv, error code = %d ",WSAGetLastError() );
				CloseClient( lpSktContext, lpIOContext );
			}
		
		}
	}


	//	Thread啊 厚沥惑利栏肺 辆丰 茄绰 版快 贸府
	if( _Module.m_bService )
	{
		ErrorMsg("(X) World : IO Read Completed terminate");
	}


}


////////////////////////////////////////////////////////////////////////////////////////
//	Read Packet
//
//	罐篮 Packet Protocol喊肺 秦寸 累诀阑 荐青 
//	----------------------------------------------------
//	1. ZP_ECHO / ZP_BROADCAST 扁夯栏肺 荤侩
//	2. Server Monitoring侩 Packet 眠啊 累诀
////////////////////////////////////////////////////////////////////////////////////////
BOOL DBSocket::ReadPacket( _LPPER_BULK_IO_CONTEXT lpIOContext)
{
	_LPDBPACKET		lpDBPacket	= (_LPDBPACKET)lpIOContext->buf;	
	_LPDBSOCKET_FD  lpSocketFD	= (_LPDBSOCKET_FD)lpIOContext->lpSocketContext;


	lpDBPacket->dwSize -= DBPACKETHEADER_SIZE ;

//	try
//	{
		////////////////////////////////////////////////////////////////////
		// NOTENOTE: 菩哦 鞠龋拳 
		// 
		////////////////////////////////////////////////////////////////////

		 WORD wCheckSum = PacketDecrypt(lpDBPacket->strPacket, lpDBPacket->dwSize, lpDBPacket->dwSeq&31) ;

		 if ((lpDBPacket->wCheckSum != wCheckSum) )
		 {
			char cMsg[200] ;
			wsprintf(cMsg,"(X) World : CheckSum Error (P:%d C:%d) SIZE(%d) CMD(%d) SEQ(%d)",lpDBPacket->wCheckSum, wCheckSum, lpDBPacket->dwSize,lpDBPacket->dwCommand,lpDBPacket->dwSeq) ;

			//	2003.08.28  Duke Kim Log函版 	
			ErrorMsg( cMsg );

			//	#if _DEBUG
			//		MessagePrint(cMsg) ;
			//	#else 
			//		_Module.LogEvent(cMsg) ;
			//	#endif
		 }
		 else 
		 {
			// 肺弊牢 辑滚 加档 氢惑阑 困秦 窃荐 器牢磐 荤侩 
			// 窃荐 器牢磐 荤侩矫 滚弊 规瘤甫 困秦 菩哦 裹困甫 疙矫 秦具窃 
			// IF 巩栏肺 菩哦狼 裹困甫 眉农且 鞘夸啊 乐促. 

#ifdef _DEBUG
			PacketTrace(lpDBPacket->dwCommand)	;	 
#endif

#ifdef DEF_USEONESOCKET
			// 泅犁 荤侩吝牢 家南俊 坷绰 菩哦栏肺 坷绰 沥焊父 罐绰促.
			if( m_SocketFD[ m_nNowSocketNum ] == lpSocketFD)
			{
				OnTransFunc[lpDBPacket->dwCommand].proc(this,  lpIOContext );
			}
#else
			OnTransFunc[lpDBPacket->dwCommand].proc(this,  lpIOContext );
#endif
			
		 } // if (lpDBPacket->wCheckSum != wCheckSum)
/*
	}
	catch( ... )
		{
			static int x = 0;
			char cMsg[200] ;



			wsprintf(cMsg,"(X)(%d) Unhandled msg[%d] ",x++,	lpDBPacket->dwCommand) ;
	#if _DEBUG
			MessagePrint(cMsg) ;
	#else 
			_Module.LogEvent(cMsg) ;
	#endif
		}
*/

	// ---------------------------------------------------------------------
	//	Recv IO啊 肯丰登搁 货肺款 IO 滚橇甫 父甸绢 WSARecv 措扁 矫淖促..
	//	扁粮 Recv甫 肯丰茄 滚橇狼 积疙篮 咯扁 鳖瘤促. 
	// ---------------------------------------------------------------------
	ReleaseIOContext( lpIOContext );

	return TRUE;
}



////////////////////////////////////////////////////////////////////////////////////////
// NOTENOTE: 辑滚 加档 氢惑阑 困秦 窃荐 器牢磐 荤侩 
// 
////////////////////////////////////////////////////////////////////////////////////////
void WorldPacket_Nothing(_LPDBSOCK lpWorldSock, _LPPER_BULK_IO_CONTEXT lpIOContext )
{
	return ;
}


////////////////////////////////////////////////////////////////////////////////////////
//	PLAYER CLOSE
//
//	-	SOCKET FD蔼阑	犁劝 咯何 犬牢
//	-	秦寸 荤侩磊甫 茫酒辑 碍犁肺 昏力 矫糯 
//	-	茫瘤 给茄 版快	WORLD SERVER俊 皋矫瘤 傈价 
/////////////////////////////////////////////////////////////////////////////////////////
void WorldPacket_PlayerClose(_LPDBSOCK lpWorldSock, _LPPER_BULK_IO_CONTEXT lpIOContext )
{
	_LPDBPACKET		pDBPacket	= (_LPDBPACKET)lpIOContext->buf;	
	_LPSOCKET_FD	pSocketFD	= (_LPSOCKET_FD)pDBPacket->pSocketFD;
		

⌨️ 快捷键说明

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