Esempio n. 1
0
void CGateCore::OnClientSocketEvent(int message, int wParam, int lParam)
{
 int iClientH, iTemp, iRet;

	iTemp = WM_ONCLIENTSOCKETEVENT;
	iClientH = message - iTemp;

	if (m_pClientList[iClientH] == NULL) return;

	iRet = m_pClientList[iClientH]->m_pXSock->iOnSocketEvent(wParam, lParam);
	switch (iRet) {
	case DEF_XSOCKEVENT_READCOMPLETE:
		// 메시지가 수신되었다. 
		OnClientRead(iClientH);
		break;
	
	case DEF_XSOCKEVENT_BLOCK:
		PutLogList("Socket BLOCKED!");
		break;
	
	case DEF_XSOCKEVENT_CONFIRMCODENOTMATCH:
		sprintf(G_cTxt,"<%d> Confirmcode notmatch!", iClientH);
		PutLogList(G_cTxt);
		delete m_pClientList[iClientH];
		m_pClientList[iClientH] = NULL;
		break;
	case DEF_XSOCKEVENT_CRITICALERROR:
		// 치명적인 에러이다.
	case DEF_XSOCKEVENT_QUENEFULL:
		// 큐가 가득찼다.
	case DEF_XSOCKEVENT_MSGSIZETOOLARGE:
		// 수신해야 할 메시지 크기가 버퍼보다 크다.	종료해야만 한다.
	case DEF_XSOCKEVENT_SOCKETERROR:
		// 소켓에 에러가 났다.
	case DEF_XSOCKEVENT_SOCKETCLOSED:
		// 소켓이 닫혔다.
		if (m_pClientList[iClientH]->m_bIsGameServer == true) {
			sprintf(G_cTxt,"*** CRITICAL ERROR! Game Server(%s) connection lost!!! ***", m_pClientList[iClientH]->m_cName);
			// 서버 다운을 알린다.
			SendMsgToMonitor(MSGID_GAMESERVERDOWN, DEF_MSGTYPE_CONFIRM, m_pClientList[iClientH]->m_cName);
			m_pPartyManager->GameServerDown(iClientH);
  		}
		else sprintf(G_cTxt,"WARNING! Monitor(%d) connection lost!", iClientH);
		PutLogList(G_cTxt);
		delete m_pClientList[iClientH];
		m_pClientList[iClientH] = NULL;
		break;
	}
}
Esempio n. 2
0
long CSSLClientApplication::OnServerRead(CContextItem* mContext, CListItem* &mBuffer, long size, long opSide)						//
{
	CSSLContext* sslContext = (CSSLContext*)mContext;
	long ret_err = 0x01;																											//
	int result;

	int byteTotal;

	__TRY

	ret_err = 0x10;
	if (WriteEncode(mContext, mBuffer, size) <= 0) break;

	ret_err = 0x20;
	byteTotal = ReadDecode(mContext, mBuffer, mBuffer->BufferType->BufferSize);

	if (byteTotal > 0)
	{
		ret_err = 0x30;	
		if ( CInterApplication::OnServerRead(mContext, mBuffer, byteTotal, opSide) ) break;
	}
	else
	{
		ret_err = 0x40;
		if (TranSSLforWrite(mContext, mBuffer, 0, OP_CLIENT_WRITE, OPSIDE_SERVER)) break;

		ret_err = 0x50;
		CListItem* wBuffer = sslContext->waitBuffer;
		if (wBuffer && SSL_is_init_finished(sslContext->ssl))
		{
			sslContext->waitBuffer = 0;
			wBuffer->NOperation = OP_CLIENT_READ;
			result = OnClientRead(sslContext, wBuffer, wBuffer->NProcessSize, 0);
// 				FreeApplicationBuffer(mBuffer);
			mBuffer = 0;
		}
	}

	__CATCH(MODULE_APPLICATION, "CSSLClientApplication - OnServerRead")
}