DragonNest/Common/NetworkLib/ClientSessionManager.cpp

1391 lines
42 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include <MMSystem.h>
#include "ClientSessionManager.h"
#include "ClientSocket.h"
#include "ClientTcpSession.h"
#include "ClientUdpSession.h"
#include "NetSocketRUDP.h"
#include "NetSocketUDP.h"
#include "DNPacket.h"
#include "DNProtocol.h"
#include "MessageListener.h"
#include "Log.h"
#include "DNProtocol.h"
#include <stdlib.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CSeqReceiver::CSeqReceiver()
{
ResetSeq();
}
CSeqReceiver::~CSeqReceiver()
{
m_RecvSync.Lock();
m_ProcessSync.Lock();
std::list <_SEQ_DATA>::iterator ii;
for (ii = m_pRecvList.begin(); ii != m_pRecvList.end(); ii++)
SAFE_DELETEA((*ii).pBuf);
m_pRecvList.clear();
m_pProcessList.clear();
m_ProcessSync.UnLock();
m_RecvSync.UnLock();
}
void CSeqReceiver::RecvData(DNEncryptPacketSeq * pPacket)
{
//from tcp
if (pPacket->cSeq == UNSEQUENCEPACKET || m_cDataSeq == pPacket->cSeq)
{
m_RecvSync.Lock();
if (pPacket->cSeq != 0) m_cDataSeq += 2;
m_RecvSync.UnLock();
AddProcessData(pPacket->Packet.cMainCmd, pPacket->Packet.cSubCmd, pPacket->Packet.buf, pPacket->Packet.iLen, _SEQDATA_TYPE_DIRECT);
}
else
RecvSeqData(pPacket->cSeq, &pPacket->Packet);
CheckSeqData();
}
void CSeqReceiver::RecvData(DNTCompPacket * pPacket)
{
//from tcp compress packet
if (pPacket->header.cSeq == UNSEQUENCEPACKET || m_cDataSeq == pPacket->header.cSeq)
{
m_RecvSync.Lock();
if (pPacket->header.cSeq != 0) m_cDataSeq += 2;
m_RecvSync.UnLock();
AddProcessData(pPacket->header.cMainCmd, pPacket->header.cSubCmd, pPacket->buf, pPacket->header.nLen, _SEQDATA_TYPE_DIRECT);
}
else
RecvSeqData(pPacket->header.cSeq, pPacket->header.cMainCmd, pPacket->header.cSubCmd, pPacket->buf, pPacket->header.nLen);
CheckSeqData();
}
void CSeqReceiver::RecvData(DNGAME_PACKET * pPacket)
{
//from udp
if (pPacket->seq == UNSEQUENCEPACKET || m_cDataSeq == pPacket->seq)
{
m_RecvSync.Lock();
if (pPacket->seq != 0) m_cDataSeq += 2;
m_RecvSync.UnLock();
AddProcessData(pPacket->header, pPacket->sub_header, pPacket->data, pPacket->datasize, _SEQDATA_TYPE_DIRECT);
}
else
RecvSeqData(pPacket->seq, pPacket->header, pPacket->sub_header, pPacket->data, pPacket->datasize);
CheckSeqData();
}
void CSeqReceiver::SkipProcess()
{
InterlockedExchange(&m_nSkipProcess, SkipFlag);
}
void CSeqReceiver::AddProcessData(BYTE cMainCmd, BYTE cSubCmd, char * pData, int nSize, int nSeqDataType)
{
_SEQ_DATA Seq;
memset(&Seq, 0, sizeof(Seq));
Seq.nLen = nSize;
Seq.cMainCmd = cMainCmd;
Seq.cSubCmd = cSubCmd;
switch (nSeqDataType)
{
case _SEQDATA_TYPE_DIRECT:
{
if( Seq.nLen > 0 ) {
Seq.pBuf = new char[Seq.nLen];
memcpy(Seq.pBuf, pData, Seq.nLen);
}
else {
Seq.pBuf = NULL;
}
m_ProcessSync.Lock();
m_pProcessList.push_back(Seq);
m_ProcessSync.UnLock();
break;
}
case _SEQDATA_TYPE_SEQ:
{
Seq.pBuf = pData;
m_ProcessSync.Lock();
m_pProcessList.push_back(Seq);
m_ProcessSync.UnLock();
break;
}
case _SEQDATA_TYPE_RECURSIVE:
{
if( Seq.nLen > 0 ) {
Seq.pBuf = new char[Seq.nLen];
memcpy(Seq.pBuf, pData, Seq.nLen);
}
else {
Seq.pBuf = NULL;
}
m_pProcessList.push_front(Seq);
break;
}
}
}
void CSeqReceiver::ClearProcessData()
{
{
ScopeLock <CSyncLock> sync(m_RecvSync);
for (std::list <_SEQ_DATA>::iterator ii = m_pRecvList.begin(); ii != m_pRecvList.end(); ii++)
SAFE_DELETEA((*ii).pBuf);
m_pRecvList.clear();
}
{
ScopeLock <CSyncLock> sync(m_ProcessSync);
for (std::list <_SEQ_DATA>::iterator ii = m_pProcessList.begin(); ii != m_pProcessList.end(); ii++)
SAFE_DELETEA((*ii).pBuf);
m_pProcessList.clear();
}
}
void CSeqReceiver::ResetSeq()
{
m_cDataSeq = 3;
InterlockedExchange(&m_nSkipProcess, 0);
}
void CSeqReceiver::RecvSeqData(BYTE cSeq, DNTPacket * pData)
{
_SEQ_DATA Seq;
memset(&Seq, 0, sizeof(Seq));
Seq.cSeq = cSeq;
Seq.nLen = pData->iLen;
Seq.cMainCmd = pData->cMainCmd;
Seq.cSubCmd = pData->cSubCmd;
Seq.pBuf = new char[Seq.nLen];
memcpy(Seq.pBuf, pData->buf, Seq.nLen);
m_RecvSync.Lock();
m_pRecvList.push_back(Seq);
m_RecvSync.UnLock();
}
void CSeqReceiver::RecvSeqData(BYTE cSeq, BYTE cMainCmd, BYTE cSubCmd, char * pData, int nSize)
{
_SEQ_DATA Seq;
memset(&Seq, 0, sizeof(Seq));
Seq.cSeq = cSeq;
Seq.nLen = nSize;
Seq.cMainCmd = cMainCmd;
Seq.cSubCmd = cSubCmd;
Seq.pBuf= new char[Seq.nLen];
memcpy(Seq.pBuf, pData, Seq.nLen);
m_RecvSync.Lock();
m_pRecvList.push_back(Seq);
m_RecvSync.UnLock();
}
void CSeqReceiver::CheckSeqData()
{
m_RecvSync.Lock();
std::list <_SEQ_DATA>::iterator ii;
for (ii = m_pRecvList.begin(); ii != m_pRecvList.end(); )
{
_SEQ_DATA * pSeq = &(*ii);
if (m_cDataSeq == pSeq->cSeq)
{
m_cDataSeq += 2;
AddProcessData(pSeq->cMainCmd, pSeq->cSubCmd, pSeq->pBuf, pSeq->nLen, _SEQDATA_TYPE_SEQ);
ii = m_pRecvList.erase(ii);
}
else ii++;
}
m_RecvSync.UnLock();
}
#if defined( PRE_TEST_PACKETMODULE )
CClientSessionManager::CClientSessionManager( CClientSocket* pTcpSocket/*=NULL*/)
#else
CClientSessionManager::CClientSessionManager()
#endif // #if defined( PRE_TEST_PACKETMODULE )
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
#if defined( PRE_TEST_PACKETMODULE )
if( pTcpSocket )
m_pTcpSocket = pTcpSocket;
else
m_pTcpSocket = new CClientSocket;
#else
m_pTcpSocket = new CClientSocket;
#endif // #if defined( PRE_TEST_PACKETMODULE )
m_pTcpSocket->SetReceiver(this);
m_pRUDPSocket = NULL;
m_pUDPSocket = NULL;
m_bConnectLoginServer = false;
m_bConnectVillageServer = false;
m_bConnectGameServer = false;
m_bDisConnectServer = false;
m_ConnectState = BridgeUnknown;
memset(m_szVillageIP, 0, sizeof(m_szVillageIP));
m_nVillagePort = 0;
m_nGameServerIP = 0;;
m_nGameServerUdpPort = m_nGameServerTcpPort = 0;
m_nLastLoginConnectOffset = 0;
}
CClientSessionManager::~CClientSessionManager()
{
DisconnectGameServer( true );
DisconnectLoginServer( true );
DisconnectVillageServer( true );
SAFE_DELETE( m_pTcpSocket );
SAFE_DELETE( m_pRUDPSocket );
SAFE_DELETE( m_pUDPSocket );
SAFE_DELETE_VEC(m_pTaskListener);
WSACleanup();
}
void CClientSessionManager::SendTcpPacket(int iMainCmd, int iSubCmd, char * pData, int iLen)
{
m_pTcpSocket->AddSendData(iMainCmd, iSubCmd, pData, iLen);
WriteLog( 1, ", Info, CClientSessionManager::SendPacket : TCP - iMainCmd(%d), iSubCmd(%d), iLen(%d), \n", iMainCmd, iSubCmd, iLen );
}
void CClientSessionManager::SendPacket(int iMainCmd, int iSubCmd, char * pData, int iLen, int iPrior, BYTE cSeqLevel)
{
bool bChecker = false;
WriteLog( 1, ", Info, Send Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
//rlkt_udp !
if (m_bConnectLoginServer || m_bConnectVillageServer ) //|| m_bConnectGameServer
{
m_pTcpSocket->AddSendData(iMainCmd, iSubCmd, pData, iLen);
bChecker = true;
WriteLog( 1, ", Info, CClientSessionManager::SendPacket : TCP - iMainCmd(%d), iSubCmd(%d), iLen(%d), iPrior(%d)\n", iMainCmd, iSubCmd, iLen, iPrior );
}
if (m_bConnectGameServer)
{
_ASSERT(bChecker != true);
RUDPSendPacket(iMainCmd, iSubCmd, pData, iLen, iPrior, cSeqLevel);
WriteLog( 1, ", Info, CClientSessionManager::SendPacket : UDP - iMainCmd(%d), iSubCmd(%d), iLen(%d), iPrior(%d)\n", iMainCmd, iSubCmd, iLen, iPrior );
}
}
void CClientSessionManager::RecvPacket(int iMainCmd, int iSubCmd, char * pData, int iLen, int nInsertAfter)
{
AddProcessData((BYTE)iMainCmd, (BYTE)iSubCmd, pData, iLen, _SEQDATA_TYPE_RECURSIVE);
WriteLog( 1, ", Info, CClientSessionManager::RecvPacket : iMainCmd(%d), iSubCmd(%d), iLen(%d), nInsertAfter(%d)\n", iMainCmd, iSubCmd, iLen, nInsertAfter );
}
void CClientSessionManager::DisConnectServer(bool bValidDisconnect)
{
m_bValidDisConnect = bValidDisconnect;
m_bDisConnectServer = true;
}
bool CClientSessionManager::ConnectLoginServer(const char *pIP, USHORT nPort, bool bFirstConnect)
{
if (bFirstConnect)
{
WriteLog( 0, ", Info, Connect LoginServer..\n" );
WriteLog( 1, ", Info, ConnectLoginServer : IP(%s), Port(%d)\n", pIP, nPort );
WriteLog( 1, ", Info, Cur Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
if( m_bConnectLoginServer ) DisconnectLoginServer( true );
if( m_bConnectVillageServer ) DisconnectVillageServer( true );
if( m_bConnectGameServer ) DisconnectGameServer( true );
bool bResult = m_pTcpSocket->Connect( pIP, nPort );
if( bResult == false ) {
WriteLog( 1, ", Error, ConnectLoginServer Result Failed\n" );
WriteLog( 0, ", Error, Connect LoginServer Failed\n" );
return false;
}
m_bConnectLoginServer = true;
WriteLog( 1, ", Info, ConnectLoginServer Result Succeess\n" );
WriteLog( 0, ", Info, Connect LoginServer Success\n" );
#if defined( PRE_ADD_HSHIELD_LOG )
if( strstr( pIP, "211.39.159.3" ) )
CGlobalInfo::GetInstance().m_bUseHShieldLog = true;
#endif // #if defined( PRE_ADD_HSHIELD_LOG )
}
else
{
// strcpy_s(m_szLoginIP, pIP);
// m_nLoginPort = nPort;
m_ConnectState = (eBridgeState)VillageToLogin; //<2F><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
return true;
}
bool CClientSessionManager::ConnectLoginServer(std::vector<std::string> &szVecIP, std::vector<USHORT> &nVecPort, bool bFirstConnect)
{
srand( timeGetTime() );
m_szLoginVecIPList = szVecIP;
m_nVecLoginPortList = nVecPort;
if( m_nLastLoginConnectOffset >= (int)m_szLoginVecIPList.size() ) m_nLastLoginConnectOffset = 0;
if( bFirstConnect ) {
int nConnectTrialCount = 1 + ( (int)m_szLoginVecIPList.size() * 2 );
#if defined(PRE_FIX_LOGINSERVER_CONNECT)
m_nLastLoginConnectOffset = rand()%(int)m_szLoginVecIPList.size();
#else // #if defined(PRE_FIX_LOGINSERVER_CONNECT)
int m_nLastLoginConnectOffset = rand()%(int)m_szLoginVecIPList.size();
#endif // #if defined(PRE_FIX_LOGINSERVER_CONNECT)
for( int i=0; i<nConnectTrialCount; i++ ) {
std::string szIP = m_szLoginVecIPList[m_nLastLoginConnectOffset];
USHORT nPort = m_nVecLoginPortList[m_nLastLoginConnectOffset];
if( ConnectLoginServer( szIP.c_str(), nPort, true ) ) return true;
m_nLastLoginConnectOffset++;
if( m_nLastLoginConnectOffset >= (int)m_szLoginVecIPList.size() ) m_nLastLoginConnectOffset = 0;
}
}
else {
std::string szIP = m_szLoginVecIPList[m_nLastLoginConnectOffset];
USHORT nPort = m_nVecLoginPortList[m_nLastLoginConnectOffset];
return ConnectLoginServer( szIP.c_str(), nPort, false );
}
return false;
}
bool CClientSessionManager::ConnectVillageServer(const char *pIP, USHORT nPort, int nBridgeState)
{
_strcpy(m_szVillageIP, _countof(m_szVillageIP), pIP, (int)strlen(pIP));
m_nVillagePort = nPort;
m_ConnectState = (eBridgeState)nBridgeState;
return true;
}
void CClientSessionManager::ConnectServer()
{
switch (m_ConnectState)
{
case BridgeUnknown:
return;
case GameToLogin:
case VillageToLogin:
{
WriteLog( 0, ", Info, Connect LoginServer..\n" );
WriteLog( 1, ", Info, ConnectLoginServer : IP(%s), Port(%d)\n", m_szLoginVecIPList[m_nLastLoginConnectOffset].c_str(), m_nVecLoginPortList[m_nLastLoginConnectOffset] );
WriteLog( 1, ", Info, Cur Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
if( m_bConnectLoginServer ) DisconnectLoginServer( true );
if( m_bConnectVillageServer ) DisconnectVillageServer( true );
if( m_bConnectGameServer ) DisconnectGameServer( true );
bool bResult = m_pTcpSocket->Connect( m_szLoginVecIPList[m_nLastLoginConnectOffset].c_str(), m_nVecLoginPortList[m_nLastLoginConnectOffset] );
if( bResult == false ) {
WriteLog( 1, ", Error, ConnectLoginServer Result Failed\n" );
WriteLog( 0, ", Error, Connect LoginServer Failed\n" );
m_nLastLoginConnectOffset++;
if( m_nLastLoginConnectOffset >= (int)m_szLoginVecIPList.size() ) m_nLastLoginConnectOffset = 0;
return ;
}
m_bConnectLoginServer = true;
WriteLog( 1, ", Info, ConnectLoginServer Result Succeess\n" );
WriteLog( 0, ", Info, Connect LoginServer Success\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult( true, m_ConnectState, 0, 0 );
break;
}
case LoginToVillage:
case GameToVillage:
case VillageToVillage:
{
WriteLog( 0, ", Info, Connect VillageServer..\n" );
WriteLog( 1, ", Info, ConnectVillageServer : IP(%s), Port(%d)\n", m_szVillageIP, m_nVillagePort );
WriteLog( 1, ", Info, Cur Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
if( m_bConnectLoginServer ) DisconnectLoginServer( true );
if( m_bConnectVillageServer ) {
if( strcmp( m_pTcpSocket->GetServerIP(), m_szVillageIP ) == NULL && m_pTcpSocket->GetServerPort() == m_nVillagePort )
{
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(true, m_ConnectState, 0, 0);
break;
}
DisconnectVillageServer( true );
}
if( m_bConnectGameServer ) DisconnectGameServer( true );
bool bResult = m_pTcpSocket->Connect( m_szVillageIP, m_nVillagePort );
if( bResult == false ) {
WriteLog( 1, ", Error, ConnectVillageServer Result Failed\n" );
WriteLog( 0, ", Error, Connect VillageServer Failed\n" );
return;
}
m_bConnectVillageServer = true;
WriteLog( 1, ", Info, ConnectVillageServer Result Success\n" );
WriteLog( 0, ", Info, Connect VillageServer Success\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(true, m_ConnectState, 0, 0);
break;
}
case VillageToGame:
{
WriteLog( 0, ", Info, Connect GameServer..\n" );
WriteLog( 1, ", Info, ConnectGameServer : IP(%d), Port(%d), TcpPort(%d), UID(%d)\n", m_nGameServerIP, m_nGameServerUdpPort, m_nGameServerTcpPort, m_nSessionID );
WriteLog( 1, ", Info, Cur Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
if( m_bConnectLoginServer ) DisconnectLoginServer( true );
if( m_bConnectVillageServer ) DisconnectVillageServer( true );
if( m_bConnectGameServer ) DisconnectGameServer( true );
if( InitializeUdpSession( m_nGameServerUdpPort ) == false ) {
WriteLog( 1, ", Error, ConnectGameServer Result Failed : InitializeUpdSession \n" );
WriteLog( 0, ", Error, Connect GameServer Failed\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(false, m_ConnectState, m_cReqGameIDType, m_nGameTaskType);
break;
}
ResetSeq();
if( RUDPConnect( m_nGameServerIP, m_nGameServerUdpPort, m_nSessionID ) == false ) {
WriteLog( 1, ", Error, ConnectGameServer Result Failed : RUDPConnect \n" );
WriteLog( 0, ", Error, Connect GameServer Failed\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(false, m_ConnectState, m_cReqGameIDType, m_nGameTaskType);
break;
}
char szIP[IPLENMAX];
_inet_addr(m_nGameServerIP, szIP);
#ifdef PRE_MOD_INDUCE_TCPCONNECT
bool bConnected = false;
for (int nTryCount = 0; nTryCount < 5; nTryCount++)
{
if (m_pTcpSocket->Connect(szIP, m_nGameServerTcpPort))
{
bConnected = true;
break;
}
Sleep(100);
continue;
}
if (bConnected == false)
{
WriteLog( 1, ", Error, ConnectGameServer Result Failed : TCPConnect \n" );
WriteLog( 0, ", Error, Connect GameServer Failed\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(false, m_ConnectState, m_cReqGameIDType, m_nGameTaskType);
break;
}
#else //#ifdef PRE_MOD_INDUCE_TCPCONNECT
if (m_pTcpSocket->Connect(szIP, m_nGameServerTcpPort) == false)
{
WriteLog( 1, ", Error, ConnectGameServer Result Failed : TCPConnect \n" );
WriteLog( 0, ", Error, Connect GameServer Failed\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(false, m_ConnectState, m_cReqGameIDType, m_nGameTaskType);
break;
}
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
m_bConnectGameServer = true; WriteLog( 1, ", Info, ConnectGameServer Result Success \n" );
WriteLog( 0, ", Info, Connect GameServer Success\n" );
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->ConnectResult(true, m_ConnectState, m_cReqGameIDType, m_nGameTaskType);
}
}
m_ConnectState = BridgeUnknown;
}
bool CClientSessionManager::ReconnectGameServer(UINT nSessionID)
{
WriteLog( 0, ", Info, Reconnect GameServer..\n" );
WriteLog( 1, ", Info, ReconnectGameServer : SessionID(%d)\n", nSessionID );
WriteLog( 1, ", Info, Cur Connection State : Login(%c), Village(%c), Game(%c)\n", ( m_bConnectLoginServer ) ? 'o' : 'x', ( m_bConnectVillageServer ) ? 'o' : 'x', ( m_bConnectGameServer ) ? 'o' : 'x' );
if( m_bConnectGameServer )
{
//<2F><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><EFBFBD><EEB6BB> <20>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>հ<EFBFBD> rudp<64><70> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>޴µ<DEB4><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴ϴ<CCB4>.
//tcp<63><70> <20><><EFBFBD>ܾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><>! <20>̹Ƿ<CCB9> <20><EFBFBD><E7BFAC><EFBFBD><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.
if( InitializeUdpSession( m_nGameServerUdpPort ) == false ) {
WriteLog( 1, ", Error, ReconnectGameServer Result Failed : m_nGameServerUdpPort(%d)\n", m_nGameServerUdpPort );
WriteLog( 0, ", Error, Reconnect GameServer Failed\n" );
return false;
}
RUDPDisConnect();
bool bResult = RUDPConnect(m_nGameServerIP, m_nGameServerUdpPort, nSessionID);
if( !bResult ) {
WriteLog( 1, ", Error, ReconnectGameServer Result Failed : RUDPConnect : m_nGameServerIP(%d), m_nGameServerUdpPort(%d)\n", m_nGameServerIP, m_nGameServerUdpPort );
WriteLog( 0, ", Error, Reconnect GameServer Failed\n" );
}
else {
WriteLog( 1, ", Info, ReconnectGameServer Result Success\n" );
WriteLog( 0, ", Info, Reconnect GameServer Success\n" );
}
return bResult;
}
return false;
}
void CClientSessionManager::DisconnectLoginServer( bool bValidDisconnect )
{
if( !m_bConnectLoginServer ) return;
m_pTcpSocket->Close( true, bValidDisconnect );
m_bConnectLoginServer = false;
WriteLog( 0, ", Info, Disconnect LoginServer..\n" );
ClearProcessData();
}
void CClientSessionManager::DisconnectVillageServer( bool bValidDisconnect )
{
if( !m_bConnectVillageServer ) return;
m_pTcpSocket->Close( true, bValidDisconnect );
m_bConnectVillageServer = false;
WriteLog( 0, ", Info, Disconnect VillageServer..\n" );
ClearProcessData();
}
bool CClientSessionManager::ConnectGameServer(unsigned long iIP, unsigned short iPort, unsigned short nTcpPort, int iUID, int nBridgeState, char cReqGameIDType, int nGameTaskType)
{
m_nGameServerIP = iIP;
m_nGameServerUdpPort = iPort;
m_nGameServerTcpPort = nTcpPort;
m_nSessionID = iUID;
m_ConnectState = (eBridgeState)nBridgeState;
m_cReqGameIDType = cReqGameIDType;
m_nGameTaskType = nGameTaskType;
return true;
}
void CClientSessionManager::DisconnectGameServer( bool bValidDisconnect )
{
if( !m_bConnectGameServer ) return;
if( bValidDisconnect ) {
SendPacket(CS_SYSTEM, eSystem::CS_INTENDED_DISCONNECT, NULL, 0, _RELIABLE);
}
#ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
m_pTcpSocket->Close( true, bValidDisconnect );
ULONG uiStartTick = timeGetTime();
while (1)
{
SendPacket(CS_PARTY, eParty::CS_PARTYOUT, NULL, 0);
Sleep(10);
if (timeGetTime() - uiStartTick > (10 * 1000))
break;
}
RUDPDisConnect();
m_bConnectGameServer = false;
#else //#ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
RUDPDisConnect();
m_pTcpSocket->Close( true, bValidDisconnect );
m_bConnectGameServer = false;
#endif //#ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
WriteLog( 0, ", Info, Disconnect GameServer..\n" );
ClearProcessData();
}
bool CClientSessionManager::RUDPConnect(unsigned long iIP, unsigned short iPort, int iUID)
{
if (m_pRUDPSocket)
{
struct in_addr addr;
addr.S_un.S_addr = iIP;
if (m_pRUDPSocket->Connect(addr.S_un.S_addr, iPort) == false) {
WriteLog( 1, ", Error, CClientSessionManager::RUDPConnect1 Result Failed : IP(%d), Port(%d) \n", addr.S_un.S_addr, iPort );
return false;
}
#ifdef _USE_NATPROBE
m_pRUDPSocket->DetectAddr(s_szProbeIP[1], s_nProbePort[1]);
#endif
CSConnectRequest packet;
packet.nSessionID= iUID;
WCHAR wszIP[32];
if (GetLocalIP(wszIP))
packet.nAddrIP = _inet_addr(wszIP);
else
_ASSERT(0);
packet.nPort = GetUdpPort();
m_pRUDPSocket->Send(CS_SYSTEM, eSystem::CS_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE, 0);
OutputDebug("Send RUDP Connect Msg\n");
}
return true;
}
//bool CClientSessionManager::RUDPConnect(const char * pIP, unsigned short iPort, int iUID)
//{
// if (m_pRUDPSocket)
// {
// struct in_addr addr;
// addr.S_un.S_addr = _inet_addr(pIP);
// if (m_pRUDPSocket->Connect(addr.S_un.S_addr, iPort) == false) {
// WriteLog( 1, ", Error, CClientSessionManager::RUDPConnect2 Result Failed : IP(%s, %d), Port(%d), iUID(%d) \n", pIP, addr.S_un.S_addr, iPort, iUID );
// return false;
// }
//
//#ifdef _USE_NATPROBE
// m_pRUDPSocket->DetectAddr(s_szProbeIP[1], s_nProbePort[1]);
// if (m_pUDPSocket)
// m_pUDPSocket->DetectAddr(s_szProbeIP[1], s_nProbePort[1]);
//#endif
//
// CSConnectRequest packet;
// memset(&packet, 0, sizeof(packet));
// packet.nSessionID= iUID;
//
// m_pRUDPSocket->GetAddr(&packet.nAddrIP, &packet.nPort);
//#ifdef _USE_NATPROBE
// if (packet.nPort <= 0)
// {
// //Probe<62><65> <20><><EFBFBD>Ͽ<EFBFBD> <20>ּҸ<D6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TCP<43><50> public<69>ּҸ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.
// //Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20><>Ʈ<EFBFBD><C6AE> <20><>Ŀȣ<C4BF><C8A3>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɴϴ<C9B4>.
// WCHAR wszIP[32];
// if (GetLocalIP(wszIP))
// packet.nAddrIP = _inet_addr(wszIP);
// else _ASSERT(0);
// packet.nPort = GetUdpPort();
// }
//#endif
//
// m_pRUDPSocket->Send(CS_SYSTEM, eSystem::CS_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// OutputDebug("Send RUDP Connect Msg\n");
// }
// return true;
//}
void CClientSessionManager::RUDPDisConnect()
{
if (m_pRUDPSocket)
m_pRUDPSocket->DisConnect();
m_UDPPeerList.clear();
}
//void CClientSessionManager::RUDPRecieve(int iMainCmd, int iSubCmd, char * data, int size, _ADDR * addr)
//{
// //Check PeerManage
// if (iMainCmd == SC_SYSTEM)
// {
// switch (iSubCmd)
// {
// case eSystem::CC_PEER_CONNECT_REQUEST:
// {
// //Client Peer Connect Request
// CCPeerConnectRequest * pPacket = (CCPeerConnectRequest*)data;
//
// if (pPacket->cState == 0)
// { //Client A -> client B Peer Connect Request Msg
// if (IsPeerConnected(pPacket->nSessionID[0]) == false) //Check Sender ID
// { //if Not Connect Connection
// //Make Packet
// CCPeerConnectRequest packet;
// memcpy(&packet, pPacket, sizeof(CCPeerConnectRequest));
// packet.cState = 1;
//
// OutputDebug("step 2 connect request sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
// WriteLog(1, ", Info, step 2 connect request sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
//
// //Notify To Sender
// for (int i = 0; i < 3; i++) //considering loss packet
// UDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _inet_addr(addr->ip), htons(addr->port));
// }
// }
// else if (pPacket->cState == 1)
// { //Client B -> Client A Peer Connected Msg
// if (IsPeerConnected(pPacket->nSessionID[1]) == false)
// {
// OutputDebug("step 3 connected result sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
// WriteLog(1, ", Info, step 3 connected result sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
//
// AddPeer(_inet_addr(addr->ip), htons(addr->port), pPacket->nSessionID[1]); //adding peer
// CCPeerConnectRequest packet;
// memcpy(&packet, pPacket, sizeof(CCPeerConnectRequest));
// //Notify To Server
// RUDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// }
// }
// else if (pPacket->cState == 2)
// { //Client A -> B Peer DisConnected Msg
// if (IsPeerConnected(pPacket->nSessionID[0]) == true)
// RemovePeer(pPacket->nSessionID[0]);
// }
// return;
// }
//
// case eSystem::SC_PEER_CONNECT_REQUEST:
// {
// //Server Peer Connect Request
// SCPeerConnectRequest * pPacket = (SCPeerConnectRequest*)data;
// CCPeerConnectRequest packet;
//
// //<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><>û<EFBFBD><C3BB> <20>޾ҽ<DEBE><D2BD>ϴ<EFBFBD>.
// packet.cState = 0;
// packet.nSessionID[0] = pPacket->nSessionID[0]; //My ConID
// packet.nSessionID[1] = pPacket->nSessionID[1]; //Your ConID
// OutputDebug("step 1 connect request recv from server sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// ((unsigned char*)&pPacket->nDestAddrIP)[0], \
// ((unsigned char*)&pPacket->nDestAddrIP)[1], ((unsigned char*)&pPacket->nDestAddrIP)[2], \
// ((unsigned char*)&pPacket->nDestAddrIP)[3], pPacket->nDestAddrPort);
// WriteLog(1, ", Info, step 1 connect request recv from server sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d\n", pPacket->nSessionID[0], pPacket->nSessionID[1], \
// ((unsigned char*)&pPacket->nDestAddrIP)[0], \
// ((unsigned char*)&pPacket->nDestAddrIP)[1], ((unsigned char*)&pPacket->nDestAddrIP)[2], \
// ((unsigned char*)&pPacket->nDestAddrIP)[3], pPacket->nDestAddrPort);
// for (int i = 0; i < 3; i++) //considering loss packet
// UDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), pPacket->nDestAddrIP, pPacket->nDestAddrPort);
// return;
// }
//
// case eSystem::CC_PEER_PING:
// {
// //<2F>ι<EFBFBD><CEB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
// int seq;
// memcpy(&seq, data, sizeof(seq));
// UDPSendPacket(CS_SYSTEM, eSystem::CC_PEER_PONG, (char*)&seq, sizeof(seq), _inet_addr(addr->ip), htons(addr->port));
// return;
// }
//
// case eSystem::CC_PEER_PONG:
// {
// static unsigned int s_nAmount = 0;
// static unsigned int s_nPing = 0;
// static unsigned int s_nCnt = 0;
// int seq;
// memcpy(&seq, data, sizeof(seq));
//
// std::vector<_PEER>::iterator ii;
// for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
// {
// if (_inet_addr((*ii).addr.ip) == _inet_addr(addr->ip) && (*ii).addr.port == htons(addr->port))
// {
// (*ii).Ping[seq].nPing = timeGetTime() - (*ii).Ping[seq].nSendTick;
//
// s_nAmount += (*ii).Ping[seq].nPing;
// s_nCnt++;
// s_nPing = s_nAmount/s_nCnt;
//
// if (s_nCnt >= 32)
// { //<2F>뷫 32<33><32><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>մϴ<D5B4>.
// OutputDebug("Peer Ping seq : [%d] ping : [%d]\n", seq, s_nPing);
// s_nAmount = s_nCnt = 0;
// //<2F><20><>Ÿ<EFBFBD>ֿ̹<CCB9> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!
// if (s_nPing > 400)
// {//<2F>뷫 400<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD>´<EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> 200<30><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>.
// UINT nSessionID = (*ii).iUID;
// RemovePeer(nSessionID);
//
// CCPeerConnectRequest packet;
// memset(&packet, 0, sizeof(packet));
//
// packet.cState = 2;
// packet.nSessionID[1] = nSessionID;
//
// RUDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// }
// }
// return ;
// }
// }
// OutputDebug("Peer Ping Update Failed\n");
// WriteLog(1, ", Error, Peer Ping Update Failed\n");
// return;
// }
// }
// }
//
// for(unsigned int i = 0; i < (unsigned int)m_pVecUdpSession.size(); i++)
// m_pVecUdpSession[i]->OnDispatchMessage( iMainCmd, iSubCmd, data, size );
//}
void CClientSessionManager::RUDPSendPacket(int iMainCmd, int iSubCmd, void * pData, int iSize, int iPrior, BYTE cSeqLevel)
{
if (m_pRUDPSocket)
m_pRUDPSocket->Send(iMainCmd, iSubCmd, pData, iSize, iPrior, cSeqLevel);
if (m_pUDPSocket != NULL && (iMainCmd == CS_ACTOR || iMainCmd == CS_ACTORBUNDLE))// || iMainCmd == CS_PROP))
{
//Peer<65><72> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ°<C7B4> <20><><EFBFBD>ϴ<EFBFBD>. (Actor Msg, Prop Msg)
unsigned short iSwapHeader = SC_ACTOR;
std::vector<_PEER>::iterator ii;
for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
UDPSendPacket(iSwapHeader, iSubCmd, pData, iSize, _inet_addr((*ii).addr.ip), (*ii).addr.port);
}
}
void CClientSessionManager::UDPSendPacket(int iMainCmd, int iSubCmd, void * pData, int iSize, unsigned long iIP, unsigned short iPort)
{
if (m_pUDPSocket)
m_pUDPSocket->Send(iMainCmd, iSubCmd, pData, iSize, iIP, iPort);
}
bool CClientSessionManager::InitializeUdpSession( USHORT nPort )
{
if (m_pRUDPSocket == NULL)
{
m_pRUDPSocket = new CNetSocketRUDP;
if (!m_pRUDPSocket) return false;
m_pRUDPSocket->SetReceiver(this);
}
#ifdef _USE_PERRCONNECT
if( m_pUDPSocket == NULL ) {
m_pUDPSocket = new CNetSocketUDP("UDPThread", m_pRUDPSocket);
if (!m_pUDPSocket) return false;
if (m_pUDPSocket->Create() == true)
m_pUDPSocket->SetReciever(this);
}
#endif
return true;
}
bool CClientSessionManager::FinalizeUdpSession()
{
SAFE_DELETE(m_pRUDPSocket);
SAFE_DELETE(m_pUDPSocket);
return true;
}
//void CClientSessionManager::AddTcpSession( CClientTcpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecTcpSession.size(); i++ ) {
// if( m_pVecTcpSession[i] == pSession ) return;
// }
// m_pVecTcpSession.push_back( pSession );
//}
//
//void CClientSessionManager::AddUdpSession( CClientUdpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecUdpSession.size(); i++ ) {
// if( m_pVecUdpSession[i] == pSession ) return;
// }
// m_pVecUdpSession.push_back( pSession );
//}
//
//void CClientSessionManager::RemoveTcpSession( CClientTcpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecTcpSession.size(); i++ ) {
// if( m_pVecTcpSession[i] == pSession ) {
// m_pVecTcpSession.erase( m_pVecTcpSession.begin() + i ) ;
// return;
// }
// }
//}
//
//void CClientSessionManager::RemoveUdpSession( CClientUdpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecUdpSession.size(); i++ ) {
// if( m_pVecUdpSession[i] == pSession ) {
// m_pVecUdpSession.erase( m_pVecUdpSession.begin() + i );
// return;
// }
// }
//}
void CClientSessionManager::OnConnectTcp()
{
std::vector <CTaskListener*>::iterator ii;
for (ii = m_pTaskListener.begin(); ii != m_pTaskListener.end(); ii++)
(*ii)->OnConnectTcp();
/*DWORD dwCount = (DWORD)m_pVecTcpSession.size();
for( DWORD i=0; i<dwCount; i++ ) {
m_pVecTcpSession[i]->OnConnectTcp();
}*/
}
void CClientSessionManager::OnDisconnectTcp( bool bValidDisconnect )
{
std::vector <CTaskListener*>::iterator ii;
for (ii = m_pTaskListener.begin(); ii != m_pTaskListener.end(); ii++)
(*ii)->OnDisconnectTcp(bValidDisconnect);
/*DWORD dwCount = (DWORD)m_pVecTcpSession.size();
for( DWORD i=0; i<dwCount; i++ ) {
m_pVecTcpSession[i]->OnDisconnectTcp( bValidDisconnect );
}*/
}
//void CClientSessionManager::OnDispatchMessageTcp( int iMainCmd, int iSubCmd, char * pData, int iLen )
//{
// DWORD dwCount = (DWORD)m_pVecTcpSession.size();
// for( DWORD i=0; i<dwCount; i++ ) {
// m_pVecTcpSession[i]->OnDispatchMessage( iMainCmd, iSubCmd, pData, iLen );
// }
//
//
// std::vector<MessageListener*>::iterator it = m_MessageListenerArray.begin();
// for ( ; it != m_MessageListenerArray.end() ; it++ )
// {
// MessageListener* pListener = NULL;
// pListener = *it;
// if ( pListener )
// {
// pListener->OnDispatchMessage(iMainCmd, iSubCmd, pData, iLen);
// }
// }
//}
//void CClientSessionManager::SendGameTcpConnect(UINT nSessionID, UINT nAccountDBID, INT64 biCertifyingKey)
//{
// //<2F>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CSConnectGame packet;
// memset(&packet, 0, sizeof(packet));
// packet.nSessionID = nSessionID;
// packet.nAccountDBID = nAccountDBID;
// packet.biCertifyingKey = biCertifyingKey;
//#if defined(_KR)
// {
// CSystemInfo Info;
// Info.Init();
//
// memcpy(Login.szMID, Info.GetMachineId(), sizeof(Login.szMID));
// Login.dwGRC = Info.GetGameRoomClient();
// }
//#endif
//
// m_pTcpSocket->AddSendData(CS_SYSTEM, eSystem::CS_CONNECTGAME, (char*)&packet, sizeof(packet));
//}
void CClientSessionManager::OnDisconnectUdp( bool bValidDisconnect )
{
std::vector <CTaskListener*>::iterator ii;
for (ii = m_pTaskListener.begin(); ii != m_pTaskListener.end(); ii++)
(*ii)->OnDisconnectUdp(bValidDisconnect);
}
void CClientSessionManager::Process()
{
if( m_pTcpSocket )
{
if (m_pTcpSocket->DoUpdate() == -1)
{
m_pTcpSocket->Close();
return;
}
else
{
//<2F><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20><EFBFBD><EFBCBC> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>, <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(udp, tcp), <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>ڽ<EFBFBD><DABD>ϴ<EFBFBD>.
//<2F><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>𿩼<EFBFBD> <20><><EFBFBD><20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD>ִµ<D6B4> <20><>ġ<EFBFBD><C4A1> <20>𿩼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD><EFBFBD>嵵 ũ<><C5A9>ƼĮ<C6BC><C4AE><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹǷ<C7B9>,
//<2F>ϴ<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::list <_SEQ_DATA> ProcessList;
std::list <_SEQ_DATA>::iterator ii;
{
ScopeLock <CSyncLock> sync(m_ProcessSync);
ProcessList = m_pProcessList;
m_pProcessList.clear();
}
for (ii = ProcessList.begin(); ii != ProcessList.end(); ii++)
{
for (int i = 0; i < (int)m_pTaskListener.size(); i++)
m_pTaskListener[i]->OnDispatchMessage((*ii).cMainCmd, (*ii).cSubCmd, (*ii).pBuf, (*ii).nLen);
for (int i = 0; i < (int)m_MessageListenerArray.size(); i++)
{
if (m_MessageListenerArray[i])
m_MessageListenerArray[i]->OnDispatchMessage((*ii).cMainCmd, (*ii).cSubCmd, (*ii).pBuf, (*ii).nLen);
}
if (m_bDisConnectServer)
break;
if (InterlockedIncrement(&m_nSkipProcess)&SkipFlag)
{
InterlockedExchange(&m_nSkipProcess, 0);
break;
}
}
for (ii = ProcessList.begin(); ii != ProcessList.end(); ii++)
SAFE_DELETEA((*ii).pBuf);
ProcessList.clear();
}
}
if (m_bDisConnectServer)
{
DisconnectLoginServer(m_bValidDisConnect);
DisconnectVillageServer(m_bValidDisConnect);
DisconnectGameServer(m_bValidDisConnect);
m_bDisConnectServer = false;
}
ConnectServer();
}
void CClientSessionManager::AddTaskListener(CTaskListener * pListener)
{
std::vector <CTaskListener*>::iterator ii;
for (ii = m_pTaskListener.begin(); ii != m_pTaskListener.end(); ii++)
if ((*ii) == pListener) return;
m_pTaskListener.push_back(pListener);
}
void CClientSessionManager::RemoveTaskListener(CTaskListener * pListener)
{
std::vector <CTaskListener*>::iterator ii;
for (ii = m_pTaskListener.begin(); ii != m_pTaskListener.end(); ii++)
{
if ((*ii) == pListener)
{
m_pTaskListener.erase(ii);
return;
}
}
}
BOOL CClientSessionManager::GetLocalIP(WCHAR* pIP)
{
return m_pTcpSocket->GetLocalIP( pIP );
}
USHORT CClientSessionManager::GetLocalPort(void)
{
return m_pTcpSocket->GetLocalPort();
}
const char *CClientSessionManager::GetUdpIP()
{
return m_pTcpSocket->GetServerIP();
}
USHORT CClientSessionManager::GetUdpPort()
{
return m_pUDPSocket ? m_pUDPSocket->GetPort() : 0;
}
#ifdef _USE_NATPROBE
void CClientSessionManager::SetProbeInfo(const char * pTcpIP, const char * pUdpIP, int nTcpPort, int nUdpPort, int nOpenPort)
{
_strcpy(s_szProbeIP[0], _countof(s_szProbeIP[0]), pTcpIP, (int)strlen(pTcpIP));
_strcpy(s_szProbeIP[1], _countof(s_szProbeIP[1]), pUdpIP, (int)strlen(pUdpIP));
s_nProbePort[0] = nTcpPort;
s_nProbePort[1] = nUdpPort;
s_bNetOpen = false;
s_nPeerOpenPort = nOpenPort;
DWORD dwThreadID;
HANDLE hThread;
hThread = CreateThread(0, 0, _Accept_Test, (void*) NULL, 0, &dwThreadID);
WaitForSingleObject(hThread, 10*1000);
}
#endif
DWORD WINAPI CClientSessionManager::_Accept_Test(void * param)
{
SOCKET hUDP;
fd_set fdset;
int readbytes, addrlen, cnt, udpport;
char buffer[2048];
int pingtotal = 0, pingtest=0;
timeval tm;
SOCKADDR_IN addr;
int state = 0;
int pivot;
timeBeginPeriod(1);
hUDP = CreateUDPSocket(s_nPeerOpenPort);
for(cnt=0; cnt<10 && state < 2; cnt++) // 10 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
{
switch(state)
{
case 0 : {
static char _msg[] = "orz";
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(s_nProbePort[1]);
addr.sin_addr.S_un.S_addr = _inet_addr(s_szProbeIP[1]);
pivot = timeGetTime();
int senbytes = sendto(hUDP, _msg, 3, 0, (struct sockaddr*) &addr, sizeof(addr));
// if (senbytes == -1)
// _TRACE("%d\n", GetLastError());
break;
}
case 1 : {
addr.sin_family = AF_INET;
addr.sin_port = htons(s_nProbePort[0]);
addr.sin_addr.S_un.S_addr = _inet_addr(s_szProbeIP[0]);
for(int i=0; i<3; i++)
{
SOCKET hSocket = CreateTCPSocket(0);
if (connect(hSocket, (struct sockaddr *)&addr, sizeof(addr)) != SOCKET_ERROR)
{
unsigned short k[2];
k[0] = udpport;
k[1] = (rand()&1) ? k[0] - 9321 : k[0] - 1110;
send(hSocket, (char*)&k, 4, 0);
state = 1;
closesocket(hSocket);
}
// Sleep(50);
}
break;
}
}
tm.tv_sec = 1;
tm.tv_usec = 0;
FD_ZERO(&fdset);
FD_SET(hUDP, &fdset);
if (select(FD_SETSIZE, (fd_set*)&fdset, (fd_set*)0, (fd_set*)0, &tm) != SOCKET_ERROR)
{
if (fdset.fd_count == 0) // timeout
continue;
addrlen = sizeof(addr);
readbytes = recvfrom(hUDP, buffer, sizeof(buffer), 0, (struct sockaddr*) &addr, &addrlen);
// if (readbytes == -1)
// _TRACE("%d\n", GetLastError());
switch(state)
{
case 0 :
if (readbytes == 12)
{
cnt = 0;
struct _RETURN_UDP_ADDR
{
unsigned short port[2];
unsigned long addr[2];
} * _udp_detect = (_RETURN_UDP_ADDR*) buffer;
if (_udp_detect->port[0] == _udp_detect->port[1] &&
_udp_detect->addr[0] == _udp_detect->addr[1])
{
udpport = _udp_detect->port[0];
pingtotal += (timeGetTime() - pivot);
pingtest++;
if (pingtest >= PING_TEST_COUNT)
state = 1;
Sleep(10);
}
}
break;
case 1 :
if (readbytes == 3 && !memcmp(buffer, "OTL", 3))
{
s_bNetOpen = true;
state = 2;
}
break;
}
}
}
closesocket(hUDP);
int pingtick = (pingtotal+PING_TEST_COUNT-1) / PING_TEST_COUNT; // <20>ø<EFBFBD>
static int s_iPingCount = pingtick;
return 0;
}
SOCKET CClientSessionManager::CreateUDPSocket(int port)
{
SOCKET s;
SOCKADDR_IN addr;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET)
return false;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
if (::bind(s, (struct sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR)
{
closesocket(s);
return INVALID_SOCKET;
}
DWORD dwMode = 1;
::ioctlsocket( s, FIONBIO, &dwMode );
return s;
}
SOCKET CClientSessionManager::CreateTCPSocket(int port)
{
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
return INVALID_SOCKET;
SOCKADDR_IN addr;
ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (::bind(s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
{
closesocket(s);
return INVALID_SOCKET;
}
return s;
}
bool CClientSessionManager::IsPeerConnected(unsigned int iUID)
{
std::vector<_PEER>::iterator ii;
for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
if ((*ii).iUID == iUID)
return true;
return false;
}
void CClientSessionManager::AddPeer(unsigned long iAddr, unsigned short iPort, unsigned int iUID)
{
_PEER _peer;
memset(&_peer, 0, sizeof(_PEER));
for (int i = 0; i < sizeof(_peer.addr.ip)/sizeof(*_peer.addr.ip); i++)
_peer.addr.ip[i] = ((unsigned char*)&iAddr)[i];
_peer.addr.port = iPort;
_peer.iUID = iUID;
m_UDPPeerList.push_back(_peer);
}
void CClientSessionManager::RemovePeer(unsigned int iUID)
{
std::vector<_PEER>::iterator ii;
for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
{
if ((*ii).iUID == iUID)
{
m_UDPPeerList.erase(ii);
return;
}
}
#ifdef _DEBUG
_ASSERT(0);
#endif
}
void CClientSessionManager::CheckPeerPing()
{
if (m_pUDPSocket == NULL) return;
static unsigned long s_nLastTick = 0;
unsigned long nCurTick = timeGetTime();
if (s_nLastTick == 0) s_nLastTick = nCurTick;
if (s_nLastTick != 0 && nCurTick - s_nLastTick > 500)
{
std::vector <UINT> vDisconList;
std::vector <_PEER>::iterator ii;
for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
{
int cnt = (*ii).nSeq++&31;
(*ii).Ping[cnt].nSendTick = nCurTick;
(*ii).Ping[cnt].nPing = 0;
UDPSendPacket(CS_SYSTEM, eSystem::CC_PEER_PING, (char*)&cnt, sizeof(cnt), _inet_addr((*ii).addr.ip), (*ii).addr.port);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´µ<C2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20>մϴ<D5B4>.
//<2F>뷫 0.5<EFBFBD>ʿ<EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> ping<6E><67> <20><><EFBFBD>Ƿ<EFBFBD> 32<33><32><EFBFBD><EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD> 16<31>ʰ<EFBFBD> <20>ɸ<EFBFBD><C9B8>ϴ<EFBFBD>. <20><20><> 8<>ʿ<EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> üŷ<C3BC><C5B7> <20>ϴ°<CFB4> <20><><EFBFBD>ڽ<EFBFBD><DABD>ϴ<EFBFBD>.
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16<31>ʸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 16<31><36> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<C7BE><EEB8AE>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//rudpserver<65><72><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> server<65><72> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
bool bFlag = false;
if (cnt%16 == 0)
{
for (int i = 0; i < sizeof((*ii).Ping)/sizeof(*(*ii).Ping) || bFlag == false; i++)
bFlag = (*ii).Ping[i].nPing != 0 ? true : false;
if (bFlag == false)
{
vDisconList.push_back((*ii).iUID);
OutputDebug("Peer DisConnected SID : [%d]\n", (*ii).iUID);
}
}
}
for (int i = 0; i < (int)vDisconList.size(); i++)
{
RemovePeer(vDisconList[i]);
CCPeerConnectRequest packet;
memset(&packet, 0, sizeof(packet));
packet.cState = 2;
packet.nSessionID[1] = vDisconList[i];
RUDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE, 0);
}
s_nLastTick = nCurTick;
}
}
void CClientSessionManager::RemoveListener(MessageListener* pListener)
{
std::vector<MessageListener*>::iterator it = m_MessageListenerArray.begin();
for ( ; it != m_MessageListenerArray.end() ; it++ )
{
if ( pListener == *it )
{
m_MessageListenerArray.erase(it);
return;
}
}
}
void CClientSessionManager::LockProcessDispatchMessage( bool bLock )
{
/*if( bLock ) m_ProcessDispatchLock.Lock();
else m_ProcessDispatchLock.UnLock();*/
if( bLock ) m_ProcessSync.Lock();
else m_ProcessSync.UnLock();
}