366 lines
7.0 KiB
C++
366 lines
7.0 KiB
C++
![]() |
// KeyList.cpp: implementation of the CKeyList class.
|
|||
|
//
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
#include "KeyList.h"
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#undef THIS_FILE
|
|||
|
static char THIS_FILE[]=__FILE__;
|
|||
|
#define new DEBUG_NEW
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#include "..\SmsCenterDlg.h"
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
// Construction/Destruction
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
CKeyList::CKeyList()
|
|||
|
{
|
|||
|
m_IO = NULL;
|
|||
|
m_Key = NULL;
|
|||
|
m_Process = NULL;
|
|||
|
m_SQL = NULL;
|
|||
|
m_IOIndex = 0;
|
|||
|
m_KeyIndex = 0;
|
|||
|
m_Process = 0;
|
|||
|
}
|
|||
|
|
|||
|
CKeyList::~CKeyList()
|
|||
|
{
|
|||
|
Close();
|
|||
|
}
|
|||
|
|
|||
|
IOCP_KEY_PTR CKeyList::GetBlank_Key()
|
|||
|
{
|
|||
|
//<2F><>β<EFBFBD><CEB2><EFBFBD>ҿ<EFBFBD><D2BF>е<EFBFBD>Key
|
|||
|
for ( int i=m_KeyIndex ; i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( (m_Key[i].socket == NULL || m_Key[i].socket==INVALID_SOCKET) &&
|
|||
|
m_Key[i].lRandID==0)
|
|||
|
{
|
|||
|
m_KeyIndex = i+1;
|
|||
|
if ( m_KeyIndex>=MAX_LOGINUSER )
|
|||
|
m_KeyIndex = 0;
|
|||
|
m_Key[i].lRandID = rand();
|
|||
|
return &m_Key[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//<2F><>ͷ<EFBFBD><CDB7><EFBFBD>ҿ<EFBFBD><D2BF>е<EFBFBD>Key
|
|||
|
for ( i=0 ; i<m_KeyIndex && i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( (m_Key[i].socket == NULL || m_Key[i].socket==INVALID_SOCKET) &&
|
|||
|
m_Key[i].lRandID==0)
|
|||
|
{
|
|||
|
m_KeyIndex = i+1;
|
|||
|
if ( m_KeyIndex>=MAX_LOGINUSER )
|
|||
|
m_KeyIndex = 0;
|
|||
|
m_Key[i].lRandID = rand();
|
|||
|
return &m_Key[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
IOCP_IO_PTR CKeyList::GetBlank_IO()
|
|||
|
{
|
|||
|
//<2F><>β<EFBFBD><CEB2><EFBFBD>ҿ<EFBFBD><D2BF>е<EFBFBD>IO
|
|||
|
for ( int i=m_IOIndex ; i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( (m_IO[i].socket == NULL || m_IO[i].socket==INVALID_SOCKET) &&
|
|||
|
m_IO[i].lRandID==0)
|
|||
|
{
|
|||
|
m_IOIndex = i+1;
|
|||
|
if ( m_IOIndex>=MAX_LOGINUSER )
|
|||
|
m_IOIndex = 0;
|
|||
|
m_IO[i].lRandID = rand();
|
|||
|
// m_IO[i].IOS.lRandID=m_IO[i].lRandID;
|
|||
|
|
|||
|
m_IO[i].m_bCheckup = true;
|
|||
|
m_IO[i].m_bCompress = SENDDATA_COMPRESS; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
|
|||
|
m_IO[i].m_lAgentID =-100; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID <20><>Ĭ<EFBFBD><C4AC>Ϊ-100,δ֪<CEB4><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
m_IO[i].m_lAgentType=-100; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ-100,δ֪<CEB4><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
|||
|
return &m_IO[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//<2F><>ͷ<EFBFBD><CDB7><EFBFBD>ҿ<EFBFBD><D2BF>е<EFBFBD>IO
|
|||
|
for ( i=0 ; i<m_IOIndex && i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( (m_IO[i].socket == NULL || m_IO[i].socket==INVALID_SOCKET) &&
|
|||
|
m_IO[i].lRandID==0 )
|
|||
|
{
|
|||
|
m_IOIndex = i+1;
|
|||
|
if ( m_IOIndex>=MAX_LOGINUSER )
|
|||
|
m_IOIndex = 0;
|
|||
|
m_IO[i].lRandID = rand();
|
|||
|
// m_IO[i].IOS.lRandID=m_IO[i].lRandID;
|
|||
|
return &m_IO[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
void CKeyList::RemoveAt_Key(IOCP_KEY_PTR pKey)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if ( pKey )
|
|||
|
{
|
|||
|
if ( pKey< &m_Key[0] || pKey>&m_Key[MAX_LOGINUSER] )
|
|||
|
return ;
|
|||
|
|
|||
|
//closesocket(pKey->socket);
|
|||
|
pKey->socket = 0;
|
|||
|
pKey->lRandID = 0;
|
|||
|
}
|
|||
|
}catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
int i=0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CKeyList::RemoveAt_IO(IOCP_IO_PTR pIO)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if ( pIO )
|
|||
|
{
|
|||
|
if ( pIO< &m_IO[0] || pIO>&m_IO[MAX_LOGINUSER] )
|
|||
|
return ;
|
|||
|
|
|||
|
pIO->socket = 0;
|
|||
|
pIO->lRandID= 0;
|
|||
|
// pIO->IOS.lRandID = 0;
|
|||
|
|
|||
|
if ( pIO->m_lUserID>0 )
|
|||
|
{
|
|||
|
TCHAR szMsg[256]={0};
|
|||
|
//<2F>˳<EFBFBD>
|
|||
|
if ( pIO->m_lID==199992 ) //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
_stprintf( szMsg , _T("[%d]%s-%s<><73><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>!") , pIO->m_lLocalPort,pIO->m_szCorpName,pIO->m_szLoginName);
|
|||
|
else
|
|||
|
_stprintf( szMsg , _T("[%d]%s-%s<><73><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>!") , pIO->m_lLocalPort,pIO->m_szCorpName,pIO->m_szLoginName);
|
|||
|
if ( AfxIsValidAddress(&m_pDlg->m_Setup,sizeof(m_pDlg->m_Setup),true) )
|
|||
|
{
|
|||
|
m_pDlg->AddLog( szMsg );
|
|||
|
m_pDlg->RefreshLogin();
|
|||
|
}
|
|||
|
}
|
|||
|
memset(pIO,0,sizeof(IOCP_IO));
|
|||
|
|
|||
|
}
|
|||
|
}catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
int i=0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CKeyList::Close_IO()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if ( !m_IO )
|
|||
|
return ;
|
|||
|
//<2F><>β<EFBFBD><CEB2><EFBFBD>ҿ<EFBFBD><D2BF>е<EFBFBD>IO
|
|||
|
for ( int i=0 ; i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( (m_IO[i].socket != NULL && m_IO[i].socket!=INVALID_SOCKET) )
|
|||
|
{
|
|||
|
closesocket(m_IO[i].socket);
|
|||
|
}
|
|||
|
RemoveAt_IO(&m_IO[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CKeyList::Init(CSmsCenterDlg * pDlg)
|
|||
|
{
|
|||
|
m_pDlg = pDlg;
|
|||
|
|
|||
|
Close(); //<2F>ȹر<C8B9><D8B1>ٳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
|||
|
if ( !m_IO )
|
|||
|
{
|
|||
|
long lSize = sizeof(IOCP_IO)*MAX_LOGINUSER;
|
|||
|
m_IO = new IOCP_IO[MAX_LOGINUSER];
|
|||
|
memset(m_IO,0,sizeof(IOCP_IO)*MAX_LOGINUSER);
|
|||
|
}
|
|||
|
/*
|
|||
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for ( int i=0 ; i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
m_IO[i].buf = new char[BUFFER_SIZE];
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
if ( !m_Key )
|
|||
|
{
|
|||
|
m_Key = new IOCP_KEY[MAX_LOGINUSER];
|
|||
|
memset(m_Key,0,sizeof(IOCP_KEY)*MAX_LOGINUSER);
|
|||
|
}
|
|||
|
|
|||
|
/* m_Process = new LPVOID[MAX_SQLCONNECT];
|
|||
|
memset(m_Process,0,sizeof(LPVOID)*MAX_SQLCONNECT);
|
|||
|
|
|||
|
for ( int i=0 ; i<MAX_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
CProcessSocket * pSocket = new CProcessSocket;
|
|||
|
m_Process[i] = (LPVOID)pSocket;
|
|||
|
pSocket->SetDlg(m_pDlg);
|
|||
|
pSocket->SetIndex(i);
|
|||
|
}
|
|||
|
*/
|
|||
|
if ( !m_SQL )
|
|||
|
{
|
|||
|
m_SQL = new IOCP_SQL[MAX_SQLCONNECT];
|
|||
|
for ( int i=0 ; i<MAX_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
m_SQL[i].bUse = false;
|
|||
|
m_SQL[i].lRandID = 0;
|
|||
|
m_SQL[i].dwBeginUse = 0;
|
|||
|
m_SQL[i].dwEndUse = 0;
|
|||
|
m_SQL[i].lFuncID = 0;
|
|||
|
m_SQL[i].lUserID = 0;
|
|||
|
m_SQL[i].adoConnection.SetID(i);
|
|||
|
#ifdef SMSCENTER_USECLIENT
|
|||
|
m_SQL[i].adoConnection.SetCursorLocation(adUseClient); //<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CProcessSocket * CKeyList::GetBlank_Process()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
/*
|
|||
|
for ( int k=0 ; k<3 ; k++ ) //<2F><><EFBFBD><EFBFBD>3<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7>ҵ<EFBFBD><D2B5><EFBFBD>
|
|||
|
{
|
|||
|
for ( int i=0 ; i<MAX_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
CProcessSocket * pProcess = (CProcessSocket *)m_Process[i];
|
|||
|
if (pProcess && !pProcess->m_bUse && pProcess->m_lRandID==0 )
|
|||
|
{
|
|||
|
if ( pProcess->m_adoConnection.isOK() && pProcess->m_AdoRS.isOK() && pProcess->m_AdoRS2.isOK() )
|
|||
|
{
|
|||
|
pProcess->m_bUse = true;
|
|||
|
pProcess->m_lRandID = rand();
|
|||
|
pProcess->m_dwBeginUse = ::GetTickCount();
|
|||
|
return pProcess;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
/*
|
|||
|
//<2F>Ȳ<EFBFBD><C8B2><EFBFBD>ǰ<EFBFBD><C7B0>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>е<EFBFBD>
|
|||
|
for ( int j=0 ; j<3 ; j++ )
|
|||
|
{
|
|||
|
for ( int i=0 ; i<MIN_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
CProcessSocket * pProcess = (CProcessSocket *)m_Process[i];
|
|||
|
if ( !pProcess->m_bUse && pProcess->m_lRandID==0 )
|
|||
|
{
|
|||
|
pProcess->m_bUse = true;
|
|||
|
pProcess->m_lRandID = rand();
|
|||
|
pProcess->m_dwBeginUse = ::GetTickCount();
|
|||
|
return pProcess;
|
|||
|
}
|
|||
|
}
|
|||
|
Sleep(100);
|
|||
|
}
|
|||
|
for ( int i=MIN_SQLCONNECT ; i<MAX_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
CProcessSocket * pProcess = (CProcessSocket *)m_Process[i];
|
|||
|
if ( !pProcess->m_bUse && pProcess->m_lRandID==0 )
|
|||
|
{
|
|||
|
pProcess->m_bUse = true;
|
|||
|
pProcess->m_lRandID = rand();
|
|||
|
pProcess->m_dwBeginUse = ::GetTickCount();
|
|||
|
return pProcess;
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
/*
|
|||
|
Sleep(500);
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
void CKeyList::Close()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
Close_IO();
|
|||
|
|
|||
|
if ( m_Key )
|
|||
|
{delete []m_Key;m_Key=NULL;}
|
|||
|
/*
|
|||
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for ( int i=0 ; i<MAX_LOGINUSER ; i++ )
|
|||
|
{
|
|||
|
if ( m_IO[i].buf )
|
|||
|
delete m_IO[i].buf;
|
|||
|
}
|
|||
|
*/
|
|||
|
if ( m_IO )
|
|||
|
{delete []m_IO;m_IO=NULL;}
|
|||
|
|
|||
|
if ( m_Process )
|
|||
|
{
|
|||
|
for ( int i=0 ; i<MAX_SQLCONNECT; i++ )
|
|||
|
{
|
|||
|
CProcessSocket * pSocket = (CProcessSocket *)m_Process[i];
|
|||
|
delete pSocket;
|
|||
|
m_Process[i] = NULL;
|
|||
|
}
|
|||
|
delete m_Process;
|
|||
|
m_Process = NULL;
|
|||
|
}
|
|||
|
if ( m_SQL )
|
|||
|
{delete []m_SQL;m_SQL=NULL;}
|
|||
|
}
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
LOG_APPERROR(_T("T"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
IOCP_SQL_PTR CKeyList::GetBlank_SQL()
|
|||
|
{
|
|||
|
for ( int j=0 ; j<3 ; j++ )
|
|||
|
{
|
|||
|
for ( int i=0 ; i<MAX_SQLCONNECT ; i++ )
|
|||
|
{
|
|||
|
if ( !m_SQL[i].bUse && m_SQL[i].lRandID==0 &&
|
|||
|
m_SQL[i].adoConnection.isOK() )
|
|||
|
{
|
|||
|
m_SQL[i].bUse = true;
|
|||
|
m_SQL[i].lRandID = rand();
|
|||
|
m_SQL[i].dwBeginUse = GetTickCount();
|
|||
|
m_SQL[i].lFuncID = 0;
|
|||
|
m_SQL[i].lUserID = 0;
|
|||
|
return &m_SQL[i];
|
|||
|
}
|
|||
|
}
|
|||
|
Sleep(500);
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|