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

📄 mapserversocket.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		//	-	Client 立加 IP
		//	-	Client 积怕甫 霖厚惑怕肺 
		//	----------------------------------------------------------------------------
		lpSocketFD->socket			= SocketCleintFD;		//	SocketFD
		lpSocketFD->clientAddr		= clientAddr;			//	Client IP

		lpSocketFD->PlayerStatus	= CONNECT_READY;		//	立加惑怕
		lpSocketFD->bClose			= false;
	
		wsaBuf.buf = lpIOContext->buf;
		wsaBuf.len = MAX_BUF_SIZE;

		//	----------------------------------------------------------------------------
		//	Read IO甫 悸泼矫糯
		//	----------------------------------------------------------------------------
		ret =	WSARecv
				(	
				lpSocketFD->socket		,
				&(wsaBuf)				, 
				1						, 
				&dwNumberOfBytesRecvd	, 
				&dwFlags				, 
				(LPWSAOVERLAPPED)lpIOContext, 
				NULL	
				);

		if( (ret == SOCKET_ERROR ) &&( WSAGetLastError() != ERROR_IO_PENDING))
		{
			MessagePrint( "[%d] Map Error WSARecv",WSAGetLastError() );
			CloseClient( lpSocketFD, lpIOContext );
			
			continue;			
		}


		//	----------------------------------------------------------------------------
		//	Delay绝捞 Msg焊郴扁 / 抛胶飘 鞘夸 
		//	No Delay
		//	----------------------------------------------------------------------------
		int TimeOut = 1;	//	Disable Nagle
		
		int nRet = setsockopt( lpSocketFD->socket, IPPROTO_TCP, TCP_NODELAY, (char *)&TimeOut , sizeof(TimeOut ));

		if(nRet == SOCKET_ERROR)
		{
			ErrorMsg("(X) Map : Accept Option(TCP_NODELAY) Failed: %d\n", WSAGetLastError());	
		}	


		m_listConnection.AddTail( lpSocketFD );					//	包府 LIST俊 殿废 矫糯	

		//	----------------------------------------------------------------------------
		// Dbug Message (立加 Client 林家/肮荐 免仿)
		//	----------------------------------------------------------------------------
#if defined(_DEBUG) || defined(DEF_BUGTRACE)
		MessagePrint( "connect...ok %s ", inet_ntoa(clientAddr.sin_addr ));

		CString strMessage;
		strMessage.Format("%d / %d",m_listConnection.GetCount(), g_pMap->Count_Player()	);
		
		MessageCount( strMessage );
#endif
	} 

	CLOSESOCKET( SocketCleintFD );

	//	--------------------------------------------------------------------------------
	//	辑厚胶啊 混酒 乐阑锭 Thread啊 磷绰 版快 
	//	--------------------------------------------------------------------------------
	if( _Module.m_bService )
	{
		ErrorMsg( "(X) WorkAccept Thread Dead");
	}

	return;
}



////////////////////////////////////////////////////////////////////////////////////////
//	IO窍唱甫 付闷芭唱, SOCKET ERROR 老版快
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::CloseClient(_LPSOCKET_FD lpSktContext, _LPPER_IO_CONTEXT lpIOContext )
{
	ReleaseIOContext( lpIOContext );

	//	--------------------------------------------------------------------------------
	//	SOCKET ERROR老 锭.. 家南阑 CLOSE
	//	措扁吝牢 葛电 IO狼 fail 蜡档
	//	--------------------------------------------------------------------------------
	if( 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 );
	}

	//	--------------------------------------------------------------------------------
	//	PLAYER / SOCKET 秦力 矫糯
	//	--------------------------------------------------------------------------------
	PlayerLogOut(lpSktContext );					//	Player Logout贸府
	
	ReleaseSocketContext( lpSktContext );			//	Socket楷搬 秦力
}


////////////////////////////////////////////////////////////////////////////////////////
//	Close Client
//
//	-	Client碍力 辆丰俊 荤侩凳
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::CloseClient(_LPSOCKET_FD lpSktContext)
{
	//	--------------------------------------------------------------------------------
	//	SOCKET ERROR老 锭.. 家南阑 CLOSE
	//	措扁吝牢 葛电 IO狼 fail 蜡档
	//	--------------------------------------------------------------------------------
	if( 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 );
	}

	//	--------------------------------------------------------------------------------
	//	Socket楷搬 秦力
	//	--------------------------------------------------------------------------------
	ReleaseSocketContext( lpSktContext );			
}

////////////////////////////////////////////////////////////////////////////////////////
//	READ PACKET
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::WorkReadCompleted( )
{		
	INT						ret;
	DWORD					dwFlags;
	DWORD					dwNumberOfBytesRecvd;

	_LPPER_IO_CONTEXT		lpIOContext;
	_LPPER_IO_CONTEXT		lpPrevIOContext;

	_LPSOCKET_FD			lpSktContext;

	WSABUF					wsaTmp;
	BOOL					bIOComplete;

	char					buf[MAX_BUF_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;						
		
		//	----------------------------------------------------------------------------
		//	LIST啊 后 版快 
		//	----------------------------------------------------------------------------
		if(m_listReadCompleted.IsEmpty())	continue;					
	
		lpIOContext = (_LPPER_IO_CONTEXT)m_listReadCompleted.RemoveHead();
		
		if( !lpIOContext )
		{
			ErrorMsg("WorkReadCompleted : IO context is NULL. in WorkIOCompleted");
			continue;
		}

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

		if( lpSktContext == NULL )
		{
			ErrorMsg("(X) Map : WorkReadCompleted : 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;
		}

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

RETRY:	// Recv 俊辑 菩哦阑 2俺 捞惑 罐疽阑锭 促矫 倒酒 柯促.
		
				//	--------------------------------------------------------------------
				//	捞绢 罐扁 packet捞衬? 梅 罐篮 packet捞衬?	
				//	梅浚 0蔼阑 啊瘤绊 乐促.
				//	--------------------------------------------------------------------
				if( lpIOContext->dwTotalBytes == 0 )
				{

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

						// total 荤捞令啊 MAX_BUF_SIZE 焊促 农促 --; 捞繁 朝涵遏捞			
						if( lpIOContext->dwTotalBytes > MAX_BUF_SIZE  )
						{					
							ErrorMsg("(X) Recv. Total packet size over %d, %d\n", lpIOContext->dwTotalBytes, MAX_BUF_SIZE );
							lpIOContext->dwTotalBytes = lpIOContext->dwTransBytes;		// 泅犁 荐脚茄 父怒栏肺 力茄茄促.
							
							//	2003.08.26 Duke Kim眠啊 
							//	眠饶 秦寸 Socket狼 IP Address甫 殿废 矫糯 
							CloseClient( lpSktContext, lpIOContext );
							continue;
						}
					}
					else																// 霉 DWORD 滴 给 罐疽促.. --;
					{
	
						wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes;		// 捞饶何磐 罐霸 茄促.
						wsaTmp.len = MAX_BUF_SIZE - lpIOContext->dwTransBytes;			// 酒流 dwTotalBytes绰 0 捞促.
					}
				}

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

					//	----------------------------------------------------------------
					//	捞锅 菩哦阑 促 罐瘤 给 茄 版快 
					//	----------------------------------------------------------------
					if( lpIOContext->dwTransBytes < lpIOContext->dwTotalBytes )				
					{
						wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes;			// 捞饶何磐 罐霸 秦具瘤.. 
						wsaTmp.len = MAX_BUF_SIZE - lpIOContext->dwTransBytes;				// 倔付甫 歹 罐酒具 窍绰瘤 舅妨 拎具瘤.. 
					}
					//	----------------------------------------------------------------
					//	PACKT阑 OVER窍咯 罐篮 版快 
					//	----------------------------------------------------------------
					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;
							
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
							//Jason 2004-09-28
							//捞巴东俊 俊矾 惯积. 棵靛 蔼阑 啊瘤绊 乐绢辑 0捞 酒匆锭啊 乐促. 
							//if(lpPrevIOContext->dwCurrentSpeedTick == 0)
							{
								//Jason 2004-08-19-china
								//0 捞扼搁 菩哦捞 辨霸 甸绢 客辑 货肺 且寸 罐酒辑 弊繁促.
								//捞傈 菩哦捞 泅犁 菩哦焊促 矫埃捞 累酒具 盔劝窍霸 悼累 茄促.
								//捞傈 菩哦俊 泅犁 矫埃俊辑 1阑 猾 蔼阑 历厘茄促. 
								//泅犁 矫埃阑 1 刘啊 矫虐搁 促澜俊 捞 风凭栏肺 甸绢 棵 版快, 
								//捞傈 蔼阑 1阑 临咯档 弊 捞傈 焊窜 农绊 泅犁 焊窜 累霸 等促. 

								//InterlockedExchange((LPLONG)&(lpPrevIOContext->dwCurrentSpeedTick ), lpIOContext->dwCurrentSpeedTick - 1);
								//InterlockedIncrement((LPLONG)&(lpIOContext->dwCurrentSpeedTick ));
								
								lpPrevIOContext->dwCurrentSpeedTick = lpIOContext->dwCurrentSpeedTick - 1;
								(lpIOContext->dwCurrentSpeedTick)++;

								//go back to the before.
								//lpPrevIOContext->dwCurrentSpeedTick = lpIOContext->dwCurrentSpeedTick;

							}
#endif
							
							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;

						}
					}
					//	----------------------------------------------------------------	
					//	PACKT阑	促 罐篮 版快
					//	----------------------------------------------------------------
					else
					{
						bIOComplete = 1;			
					}
				}


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

					lpIOContext = CreateIOContext(READ);		//	货肺款 IO甫 且寸罐酒辑 促矫 措扁 矫挪促.

					if( lpIOContext )
					{			
						wsaTmp.buf = lpIOContext->buf;
						wsaTmp.len = MAX_BUF_SIZE;			
					}
					else
					{

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

						
						break;
					}
				}	

			
				ret =	WSARecv
						(
						lpSktContext->socket		,
						&wsaTmp						, 
						1							, 
						&dwNumberOfBytesRecvd		, 
						&dwFlags					, 
						(LPWSAOVERLAPPED)lpIOContext, 
						NULL
						);
	
				if( ret == SOCKET_ERROR && ( WSAGetLastError() != ERROR_IO_PENDING))
				{
					ErrorMsg( "2.Error WSARecv, error code = %d", WSAGetLastError());
					CloseClient( lpSktContext, lpIOContext );
				}

		}
		else
		{
			ErrorMsg( "(X) .Error NOT IO READ" );
			ReleaseIOContext(lpIOContext);
		}

	}	

	//	--------------------------------------------------------------------------------
	//	辑厚胶啊 混酒 乐阑锭 Thread啊 磷绰 版快 (Duke Kim 2003.08.27)
	//	--------------------------------------------------------------------------------
	if( _Module.m_bService )
	{
		ErrorMsg( "(X) ReadCompleted Thread Dead");
	}	
}


//////

⌨️ 快捷键说明

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