1390 lines
42 KiB
C++
1390 lines
42 KiB
C++
#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();
|
||
}
|