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

📄 cmserclientsock.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

	return TRUE;
}

void CMSerClientSock::StopThread()
{
	m_stThreadLoop = false;
	SetEvent(m_hEvent[1]);
}

DWORD CMSerClientSock::EventSocketRunner(LPVOID parameter )
{

	CMSerClientSock* pSockThread = (CMSerClientSock *)parameter;

	pSockThread->run();
	return 0;

}
void CMSerClientSock::run()
{
	WSANETWORKEVENTS events;
	DWORD dwRet;
	int count = 0;

	int nError;
	char	cFrom = 1;
	unsigned short sID = 0;
	unsigned short sMsgType = 0;

	m_stThreadLoop = true;
	//connect 啊瓷窍促.
	m_IsStart = TRUE;
	while(m_stThreadLoop == true )
	{
		dwRet = WSAWaitForMultipleEvents(2,
			m_hEvent,
			FALSE,
			WSA_INFINITE,
			FALSE);
		if(dwRet == WSA_WAIT_FAILED)
		{
			nError = WSAGetLastError();
			CMSingleton<CMDebug>::getInstance()->output("%s(%d)run() Error (%d)",__FILE__,__LINE__,nError);
		}
		else if( dwRet == WSA_WAIT_EVENT_0)
		{
			WSAResetEvent( m_hEvent[0]);
		}


		int nRet = WSAEnumNetworkEvents(m_hConnectSocket,
			m_hEvent[0],
			&events);

		if (nRet == SOCKET_ERROR)
		{
			nError = WSAGetLastError() ;
			CMSingleton<CMDebug>::getInstance()->output("%s(%d)run() Error (%d)",__FILE__,__LINE__,nError);
			break;
		}

		if((events.lNetworkEvents & FD_READ) == FD_READ)//佬绢柯 单捞鸥啊 乐促
		{
			int iRet = -1;

			iRet = _iOnRead(&sID,&sMsgType);

			if(iRet == DEF_READCOMPLETE)	//	茄俺狼 菩哦阑 己傍利栏肺 罐菌促.
			{
				//府矫宏钮俊 单捞鸥甫 笼绢 持绢霖促.
				if(m_pQueue == NULL)
				{
					CMSingleton<CMDebug>::getInstance()->output("%s(%d)m_pQueue == NULL(橇肺弊伐 辆丰矫 秦力 啊瓷己.)",__FILE__,__LINE__);
					return ;
				}
				CMOVERLAPPED OV;
				OV.s = m_hConnectSocket;
				m_pQueue->PackPush(m_hConnectSocket
					, m_pRcvBuffer			// 佬篮 单捞鸥 第肺 器牢磐 捞悼.
					,m_dwCompleteReadSize,m_dwID,&OV);
			}
			else if(iRet == DEF_SOCKETCLOSED)	//家南捞 摧躯促.
			{
			}
			else if(iRet == DEF_ONREAD)			//recv 单捞鸥甫 傈何 佬瘤 给沁促.
			{
			}
			else if(iRet == DEF_SOCKETERROR)	//家南俊矾.
			{
				nError = WSAGetLastError() ;
				CMSingleton<CMDebug>::getInstance()->output("%s(%d)Recv Error (%d)",__FILE__,__LINE__,nError);
			}
			else
			{
				//else if(iRet == DEF_BLOCK)
				//else if(iRet == DEF_MSGSIZETOOLARGE)
			}
		}
		else if (events.lNetworkEvents & FD_CONNECT)
		{
			if (events.iErrorCode[FD_CONNECT_BIT] == 0)
			{
				//辑滚客 connect登菌促.
				//				m_sSockState = DEF_CONNECTED;
				m_dwID = m_dwRandomID;
				m_dwRandomID++;
			}
			else if (events.iErrorCode[FD_CONNECT_BIT] == WSAECONNREFUSED)
			{
				//辑滚俊辑 立加阑 芭何 窍看促.
				//				m_sSockState = DEF_REJECTCONNECT;
			}
			else
			{
				nError = WSAGetLastError() ;
				CMSingleton<CMDebug>::getInstance()->output("%s(%d)Unknown network event error (%d)",__FILE__,__LINE__,events.iErrorCode[FD_CONNECT_BIT]);
				break;
			}
		}

		if((events.lNetworkEvents & FD_WRITE) == FD_WRITE)
		{

		}

		//困俊 if巩苞 蝶肺 贸府 茄促.  府矫宏 皋技瘤客 努肺令啊 鞍捞 甸绢 坷绰版快啊 乐促.
		if((events.lNetworkEvents & FD_CLOSE) == FD_CLOSE)//辑滚啊 摧躯促..
		{
			//			m_sSockState = DEF_CLOSED;
			printf("Server Closed!!");
		}
	} // while....


}

//-------------------------------------------------------------------------------------------------------
//	Name		 :: BOOL _iOnRead()
//	Create Date	 :: 2004/01/07
//	Description	 :: RECV窍绊 单捞鸥甫 罐绰何盒.
//	param		 ::	
//	Return Value :: BOOL(int) 屈 : SOCKET 俊矾 鸥涝.
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
BOOL CMSerClientSock::_iOnRead(unsigned short *sId,unsigned short *sGameType)
{
	int iRet, WSAErr;
	//short  * sp;
	//unsigned short sID;
	//unsigned short sMsgType = 0;
	unsigned short sDataSize = 0;
	unsigned short sReplayID = 0;

	if (m_cStatus == DEF_CMSOCKSTATUS_READINGHEADER) {

		iRet = recv(m_hConnectSocket, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);	

		if (iRet == SOCKET_ERROR) {
			WSAErr = WSAGetLastError();
			if (WSAErr != WSAEWOULDBLOCK) {
				m_WSAErr = WSAErr;
				return DEF_SOCKETERROR;
			}
			else return DEF_BLOCK;
		}
		else 
			if (iRet == 0) {
				// 家南捞 摧躯促. 
				//			m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
				return DEF_SOCKETCLOSED;
			}

			m_dwReadSize      -= iRet;
			m_dwTotalReadSize += iRet;

			if (m_dwReadSize == 0) {
				// 庆歹甫 促 佬菌促. 
				m_cStatus = DEF_CMSOCKSTATUS_READINGBODY;
				// 佬绢具 且 个眉 荤捞令甫 拌魂茄促.

				//	庆歹 菩哦 盒籍.
				if(FALSE == m_pEditPacket->PackDecode(m_pRcvBuffer))		//庆歹 菩哦捞 鞠龋拳 登绢 乐栏搁 钱绢霖促.
				{
					//	菩哦 庆歹啊 力措肺 救登菌促.
					//	碍力 立加 辆丰.
					//					DoClose(OV,true);
					CMSingleton<CMDebug>::getInstance()->output("%s(%d)秦欧 啊瓷己 丑饶.!!!(%d)",__FILE__,__LINE__,m_hConnectSocket);
					return	DEF_WORKREADERR_DECODE_ERR;	
				}

				m_pEditPacket->GetHeaderInfo(m_pRcvBuffer,sId,sGameType,&sDataSize,&sReplayID);

				//			sp = (short *)((char*)m_pRcvBuffer + HEAD_SIZE_POISTION);
				//m_dwReadSize = (int)*sp; // 庆歹 荤捞令绰 器窃窍瘤 臼绰促. 

				m_dwReadSize = (int )sDataSize;
				if (m_dwReadSize == 0) {
					// 个眉 荤捞令啊 0捞搁 个眉何盒阑 佬阑 鞘夸啊 绝栏骨肺 
					m_cStatus        = DEF_CMSOCKSTATUS_READINGHEADER;
					m_dwReadSize      = PACKETHEADERSIZE;
					m_dwCompleteReadSize = m_dwTotalReadSize;
					m_dwTotalReadSize = 0;
					return DEF_READCOMPLETE;
				}
				else 
					if (m_dwReadSize > m_dwBufferSize) {
						m_cStatus         = DEF_CMSOCKSTATUS_READINGHEADER;
						m_dwReadSize      = PACKETHEADERSIZE;
						m_dwTotalReadSize = 0;
						return DEF_MSGSIZETOOLARGE;
					}
			}
			return DEF_ONREAD;
	}
	else
		if (m_cStatus == DEF_CMSOCKSTATUS_READINGBODY) {

			iRet = recv(m_hConnectSocket, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);

			if (iRet == SOCKET_ERROR) {
				WSAErr = WSAGetLastError();
				if (WSAErr != WSAEWOULDBLOCK) {
					m_WSAErr = WSAErr;
					return DEF_SOCKETERROR;
				}
				else return DEF_BLOCK;
			}
			else 
				if (iRet == 0) {
					// 家南捞 摧躯促. 
					//			m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
					return DEF_SOCKETCLOSED;
				}

				m_dwReadSize      -= iRet;
				m_dwTotalReadSize += iRet;

				if (m_dwReadSize == 0) {
					// 个眉甫 促 佬菌促. 促澜锅 捞亥飘甫 困秦 惑怕甫 官槽促. 
					m_cStatus        = DEF_CMSOCKSTATUS_READINGHEADER;
					m_dwReadSize     = PACKETHEADERSIZE;
					m_dwCompleteReadSize = m_dwTotalReadSize;
					m_dwTotalReadSize = 0;
				}
				else return DEF_ONREAD;
		}

		// 皋矫瘤甫 葛滴 佬菌促. 捞 皋矫瘤甫 罐栏搁 努贰胶 滚欺狼 郴侩阑 佬绢 溜阿 贸府秦具 茄促.
		return DEF_READCOMPLETE;

}

BOOL CMSerClientSock::bSetOverlapped(int iRecvQueue)
{
	int zero = 0;
	
	m_OverlappedIO.iRecvQueueNum = iRecvQueue;

	m_OverlappedIO.pRecvContext = new RECVIOCONTEXT;
	m_OverlappedIO.eState		 = eREAD;
	m_OverlappedIO.iAcceptServer = eServerClient;
	m_OverlappedIO.sOverlappedID = 30000;


	m_OverlappedIO.iMoreRecv = 0;
	m_OverlappedIO.eRecvState = eNormalRecv;
	m_OverlappedIO.eState = eACCEPT;

	//	荤侩磊付促 罚待 绊蜡 酒捞叼 何咯..
	m_OverlappedIO.dwRandomID = 100;

	setsockopt( m_OverlappedIO.s, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof zero );
	setsockopt( m_OverlappedIO.s, SOL_SOCKET, SO_RCVBUF, (char *) &zero, sizeof zero );

	memset( m_OverlappedIO.pRecvContext->AcceptBuf, '\0', sizeof m_OverlappedIO.pRecvContext->AcceptBuf );
	memset( m_OverlappedIO.pRecvContext->RecvBuf , 0 , sizeof m_OverlappedIO.pRecvContext->RecvBuf );

	// IOCP俊 家南 勤甸阑 楷搬秦霖促.
	HANDLE hHandle = CreateIoCompletionPort( (HANDLE) m_OverlappedIO.s, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(),0/*(ULONG_PTR)&m_OverlappedIO.pKeyComplete*/, 0 );

	int err = WSAGetLastError();
	bServPostRecv();
	return TRUE;
}

BOOL CMSerClientSock::bServPostRecv()
{
	BOOL result;

	m_OverlappedIO.eState = eREAD;					// 坷滚乏 函荐 惑怕 函拳.

	m_OverlappedIO.recvBufferDescriptor.len = PACKETBUFFERSIZE;
	m_OverlappedIO.recvBufferDescriptor.buf = m_OverlappedIO.pRecvContext->RecvBuf;
	m_OverlappedIO.recvFlags = 0;
	result = WSARecv( m_OverlappedIO.s, &m_OverlappedIO.recvBufferDescriptor, /* number of WSABUFs */ 1,
		&m_OverlappedIO.recvBufferDescriptor.len, &m_OverlappedIO.recvFlags, &m_OverlappedIO, /* completion routine address */ 0 );
	result = ( result != SOCKET_ERROR ); // inverted logic

	if ( result )
	{
		//	OK
		return TRUE;
	}
	else
	{
		int err = GetLastError();
		if ( err != ERROR_IO_PENDING )
		{
			CMSingleton<CMDebug>::getInstance()->output("%s(%d)bServPostRecv() Error(%d)",__FILE__,__LINE__,err);
//			DoClose( m_OverlappedIO, true );
			return FALSE;
		}
	}

	return TRUE;

}

⌨️ 快捷键说明

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