SmsCenter/IOCP/IOCP.cpp

1681 lines
38 KiB
C++
Raw Normal View History

2025-01-03 16:47:25 +08:00
#include "stdafx.h"
#include "IOCP.h"
#pragma comment(lib, "ws2_32.lib")
#include "..\SmsCenterDlg.h"
/////////////////////////////////////////////////////////////////////////////////////////////
CIOCP::CIOCP()
{
m_pDlg = NULL;
m_listen_socket = INVALID_SOCKET;
m_listen_socket2 = INVALID_SOCKET;
m_bInitSocket = false;
m_bInitSocket2 = false;
m_bInit = false;
m_h_MainLoop = INVALID_HANDLE_VALUE;
m_h_MainLoop2 = INVALID_HANDLE_VALUE;
m_bQuit = false;
}
CIOCP::~CIOCP()
{
Close();
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD>رղ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
-------------------------------------------------------------------------------------------*/
void CIOCP::Close()
{
try
{
int i;
if ( !m_bInit )
return ;
m_bQuit = true;
if (m_h_MainLoop!=INVALID_HANDLE_VALUE )
{
if (WaitForSingleObject(m_h_MainLoop,3000)== WAIT_TIMEOUT )
TerminateThread(m_h_MainLoop,0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
CloseHandle(m_h_MainLoop);
m_h_MainLoop = INVALID_HANDLE_VALUE;
}
if (m_h_MainLoop2!=INVALID_HANDLE_VALUE )
{
if ( WaitForSingleObject(m_h_MainLoop2,3000)== WAIT_TIMEOUT )
TerminateThread(m_h_MainLoop2,0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
CloseHandle(m_h_MainLoop2);
m_h_MainLoop2 = INVALID_HANDLE_VALUE;
}
PostQueuedCompletionStatus( m_h_iocp, 0, 0, NULL );
CloseHandle( m_h_iocp );
for( i = 0; i < m_n_thread_count; i++ )
{
if (m_h_thread[i]!=INVALID_HANDLE_VALUE )
{
if ( WaitForSingleObject(m_h_thread[i],1000)== WAIT_TIMEOUT )
TerminateThread(m_h_thread[i],0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
CloseHandle( m_h_thread[i] );
m_h_thread[i] = INVALID_HANDLE_VALUE;
}
}
Sleep(200); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
m_KeyList.Close();
CloseMainSocket();
m_bInit = false;
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
-------------------------------------------------------------------------------------------*/
void CIOCP::InitIoContext(IOCP_IO_PTR lp_io)
{
if ( !lp_io )
return ;
try
{
if ( lp_io< &m_KeyList.m_IO[0] || lp_io>&m_KeyList.m_IO[MAX_LOGINUSER] )
return ;
memset( &lp_io->ol, 0, sizeof( WSAOVERLAPPED ) );
//memset( &lp_io->buf, 0, BUFFER_SIZE );
lp_io->wsaBuf.buf = lp_io->buf;
lp_io->wsaBuf.len = BUFFER_SIZE;
lp_io->lRecvLen = 0;
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SOCKET<EFBFBD>˿ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ˿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::InitSocket()
{
//<2F>˿<EFBFBD>1<EFBFBD><31>ʼ<EFBFBD><CABC>
m_listen_socket = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
if( INVALID_SOCKET == m_listen_socket )
{
return FALSE;
}
//IOCP_KEY_PTR lp_key = m_key_group.GetBlank();
IOCP_KEY_PTR lp_key = m_KeyList.GetBlank_Key();
if ( !lp_key )
return FALSE;
lp_key->socket = m_listen_socket;
HANDLE hRet = CreateIoCompletionPort( (HANDLE)m_listen_socket, m_h_iocp, (ULONG_PTR)lp_key, 0 );
2025-01-03 16:47:25 +08:00
if( hRet == NULL )
{
CloseOneSocket( m_listen_socket );
//m_key_group.RemoveAt( lp_key );
m_KeyList.RemoveAt_Key( lp_key );
return FALSE;
}
//<2F>˿<EFBFBD>2<EFBFBD><32>ʼ<EFBFBD><CABC>
m_listen_socket2 = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
if( INVALID_SOCKET == m_listen_socket2 )
{
return FALSE;
}
//IOCP_KEY_PTR lp_key2 = m_key_group.GetBlank();
IOCP_KEY_PTR lp_key2 = m_KeyList.GetBlank_Key();
lp_key2->socket = m_listen_socket2;
hRet = CreateIoCompletionPort( (HANDLE)m_listen_socket2, m_h_iocp, (ULONG_PTR)lp_key2, 0 );
2025-01-03 16:47:25 +08:00
if( hRet == NULL )
{
CloseOneSocket( m_listen_socket );
//m_key_group.RemoveAt( lp_key );
m_KeyList.RemoveAt_Key( lp_key );
CloseOneSocket( m_listen_socket2 );
//m_key_group.RemoveAt( lp_key2 );
m_KeyList.RemoveAt_Key( lp_key2 );
return FALSE;
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
-------------------------------------------------------------------------------------------*/
void CIOCP::CloseThreadHandle(int count )
{
if( count <= 0 )
{
return;
}
for( int i= 0; i < count; i++ )
{
if (m_h_thread[i]!=INVALID_HANDLE_VALUE )
{
if ( WaitForSingleObject(m_h_thread[i],1000)== WAIT_TIMEOUT )
TerminateThread(m_h_thread[i],0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
CloseHandle( m_h_thread[i] );
m_h_thread[i] = INVALID_HANDLE_VALUE;
}
}
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD>PORT<EFBFBD>󶨣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::BindAndListenSocket()
{
SOCKADDR_IN addr;
memset( &addr, 0, sizeof(SOCKADDR_IN) );
addr.sin_family = AF_INET;
//addr.sin_addr.s_addr = inet_addr( ADDR );
//addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = m_pDlg->m_Setup.addr;
#ifdef UNICODE
addr.sin_port = htons( DEFAULT_SERVERPORT_UNI );
#else
addr.sin_port = htons( DEFAULT_LISTENPORT );
#endif
int nRet;
nRet = bind( m_listen_socket, (SOCKADDR*)&addr, sizeof( SOCKADDR ) );
if( SOCKET_ERROR == nRet)
2025-01-03 16:47:25 +08:00
{
//cout<<"bind fail!"<<endl;
int er = WSAGetLastError();
return FALSE;
}
nRet = listen( m_listen_socket, 50 );
if( SOCKET_ERROR == nRet )
{
//cout<<"listen fail!"<<endl;
return FALSE;
}
m_bInitSocket = true;
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::StartThread()
{
int i;
SYSTEM_INFO sys_info;
GetSystemInfo( &sys_info );
m_n_thread_count = sys_info.dwNumberOfProcessors*2;
if (m_n_thread_count<2 || m_n_thread_count>MAXTHREAD_COUNT )
m_n_thread_count = MAXTHREAD_COUNT;
//m_n_thread_count = 4;
for( i = 0; i < m_n_thread_count; i++ )
{
m_h_thread[i] = CreateThread( NULL, 0, CompletionRoutine, (LPVOID)this, 0, NULL );
if( INVALID_HANDLE_VALUE == m_h_thread[i] )
{
CloseThreadHandle( i );
CloseHandle( m_h_iocp );
return FALSE;
}
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::PostAcceptEx()
{
#ifdef _DEBUG
int count = 10;
#else
int count = 30;
#endif
DWORD dwBytes;
BOOL bRet;
for( int i = 0; i < count; i++ )
{
SOCKET socket = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
if( INVALID_SOCKET == socket )
{
//cout<<"post accept ex fail!"<<WSAGetLastError()<<endl;
continue;
}
//<2F><><EFBFBD><EFBFBD>Socket
int ulTemp=1; //<2F><>SOCKET<45><54><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>SOCKET
2025-01-03 16:47:25 +08:00
//u_long ulTemp=0; //<2F><>SOCKET<45><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>SOCKET
//ioctlsocket( socket,FIONBIO,&ulTemp );
ulTemp=128*1024;
setsockopt( socket , SOL_SOCKET, SO_SNDBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><><EFBFBD>
ulTemp=64*1024;
setsockopt( socket , SOL_SOCKET, SO_RCVBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><><EFBFBD>
/*
setsockopt( socket, SOL_SOCKET, SO_DONTLINGER,(const char *)&ulTemp,sizeof(BOOL));
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=0;//(<28><>closesocket()<29><><EFBFBD><EFBFBD>,<2C><><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// <20><><EFBFBD><EFBFBD>m_sLinger.l_onoff=0;<3B><><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>2.)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ;
m_sLinger.l_linger=0;//(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ϊ5<CEAA><35>)
int iLen=sizeof(m_sLinger);
int i = setsockopt(socket,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
*/
// int lLen=sizeof(ulTemp);
// getsockopt( socket , SOL_SOCKET, SO_SNDBUF ,(char *)&ulTemp ,&lLen); //<2F><><EFBFBD>
IOCP_IO_PTR lp_io = m_KeyList.GetBlank_IO();
if ( lp_io != NULL )
{
InitIoContext( lp_io );
lp_io->socket = socket;
lp_io->operation = IOCP_ACCEPT;
lp_io->state = SOCKET_STATE_NOT_CONNECT;
/////////////////////////////////////////////////
bRet = lpAcceptEx(
m_listen_socket,
lp_io->socket,
lp_io->buf,
// lp_io->wsaBuf.len - 2 * ( sizeof(SOCKADDR_IN) + 16 ),
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,&lp_io->ol);
if( ( bRet == FALSE ) && ( WSA_IO_PENDING != WSAGetLastError() ) )
{
closesocket( socket );
//m_io_group.RemoveAt( lp_io );
m_KeyList.RemoveAt_IO( lp_io );
//cout<<"post acceptex fail:"<<WSAGetLastError()<<endl;
continue;
}
}
else
{
int i=10;
}
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::HandleData(IOCP_IO_PTR lp_io,IOCP_KEY_PTR lp_key, int nFlags)
{
switch( nFlags )
{
case IOCP_COMPLETE_ACCEPT:
{
InitIoContext( lp_io );
lp_io->operation = IOCP_READ;
}
break;
case IOCP_COMPLETE_ACCEPT_READ:
{
/*
lp_io->operation = IOCP_WRITE;
GetAddrAndPort( lp_io->wsaBuf.buf, szAddress, uPort );
//MSG(lp_io->wsaBuf.len);
memset( &lp_io->ol, 0, sizeof(lp_io->ol) );
*/
}
break;
case IOCP_COMPLETE_READ:
{
//cout<<"read a data!*******************************"<<endl;
lp_io->lRecvLen += lp_io->wsaBuf.len;
long lRet=0;
if ( lp_io->m_lLocalPort == DEFAULT_LISTENPORT2 )
lRet = GetFrame_Cmpp(lp_io);
else
lRet = GetFrame(lp_io);
if ( lRet < 0 )
{
//<2F><><EFBFBD><EFBFBD>֡ʧ<D6A1><CAA7>
m_KeyList.RemoveAt_IO( lp_io );
m_KeyList.RemoveAt_Key( lp_key );
closesocket( lp_io->socket );
lp_io->operation = IOCP_END; //<2F>رպ<D8B1><D5BA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>
}
else
{
//<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><DDB9>󣬲<EFBFBD><F3A3ACB2><EFBFBD>û<EFBFBD>к<EFBFBD><D0BA>ʵİ<CAB5><C4B0><EFBFBD>
if ( lp_io->lRecvLen>=BUFFER_SIZE )
{
m_KeyList.RemoveAt_IO( lp_io );
m_KeyList.RemoveAt_Key( lp_key );
closesocket( lp_io->socket );
lp_io->operation = IOCP_END; //<2F>رպ<D8B1><D5BA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>
}
else
{
//<2F><><EFBFBD>¿<EFBFBD>ʼͶ<CABC><CDB6>io
lp_io->operation = IOCP_READ;
memset( &lp_io->ol, 0, sizeof(lp_io->ol) );
lp_io->wsaBuf.buf = lp_io->buf + lp_io->lRecvLen;
lp_io->wsaBuf.len = BUFFER_SIZE-lp_io->lRecvLen;
}
}
}
break;
case IOCP_COMPLETE_WRITE:
{
try
{
IOCP_IO_SEND_PTR ioS = (IOCP_IO_SEND_PTR)lp_io;
if ( ioS->wsaBuf.len >0 )
{
if ( ioS->wsaBuf.buf )
delete ioS->wsaBuf.buf;
ioS->wsaBuf.buf = NULL;
}
delete ioS;
}
catch (...)
{
LOG_APPERROR(_T("T"));
break;
}
}
break;
default:
{
//cout<<"handleData do nothing!*********************"<<endl;
return FALSE;
}
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::DataAction(IOCP_IO_PTR lp_io, IOCP_KEY_PTR lp_key )
{
DWORD dwBytes;
int nRet;
DWORD dwFlags;
switch( lp_io->operation )
{
case IOCP_WRITE:
{
nRet = WSASend(
lp_io->socket,
&lp_io->wsaBuf,
1,
&dwBytes,
0,
&lp_io->ol,NULL);
if( ( nRet == SOCKET_ERROR ) && ( WSAGetLastError() != WSA_IO_PENDING ) )
{
m_KeyList.RemoveAt_IO( lp_io );
m_KeyList.RemoveAt_Key( lp_key );
closesocket( lp_io->socket );
return FALSE;
}
}
break;
case IOCP_WRITE2:
{
/*
IOCP_IO_SEND_PTR ioS = (IOCP_IO_SEND_PTR)lp_io;
ioS->operation = IOCP_WRITE;
nRet = WSASend(
lp_key->socket,
&ioS->wsaBuf[ioS->lSendNowIndex-1],
1,
&dwBytes,
0,
&ioS->ol,NULL);
/*
if( ( nRet == SOCKET_ERROR ) && ( WSAGetLastError() != WSA_IO_PENDING ) )
{
//cout<<"WSASend fail!----------------------------------------"<<WSAGetLastError()<<endl;
closesocket( lp_io->socket );
//m_io_group.RemoveAt( lp_io );
m_KeyList.RemoveAt_IO( lp_io );
//m_key_group.RemoveAt( lp_key );
m_KeyList.RemoveAt_Key( lp_key );
return FALSE;
}
*/
}
break;
case IOCP_READ:
{
//cout<<"post a read data!-----------------------------------------"<<endl;
dwFlags = 0;
nRet = WSARecv(
lp_io->socket,
&lp_io->wsaBuf,
1,
&dwBytes,
&dwFlags,
&lp_io->ol,NULL);
if( ( nRet == SOCKET_ERROR ) && ( WSAGetLastError() != WSA_IO_PENDING ) )
{
m_KeyList.RemoveAt_IO( lp_io );
m_KeyList.RemoveAt_Key( lp_key );
closesocket( lp_io->socket );
return FALSE;
}
}
break;
case IOCP_END:
break;
default:
{
//cout<<"DataAction do nothing!------------------------------------------"<<endl;
return FALSE;
}
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD>õ<EFBFBD>MS<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>SOCKET<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::GetFunPointer()
{
DWORD dwRet,nRet;
nRet = WSAIoctl(
m_listen_socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&g_GUIDAcceptEx,
sizeof(g_GUIDAcceptEx),
&lpAcceptEx,
sizeof(lpAcceptEx),
&dwRet,NULL,NULL);
if( SOCKET_ERROR == nRet )
{
CloseOneSocket(m_listen_socket);
//cout<<"get acceptex fail!"<<WSAGetLastError()<<endl;
return FALSE;
}
nRet = WSAIoctl(
m_listen_socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&g_GUIDTransmitFile,
sizeof(g_GUIDTransmitFile),
&lpTransmitFile,
sizeof(lpTransmitFile),
&dwRet,NULL,NULL);
if(nRet == SOCKET_ERROR )
{
CloseOneSocket(m_listen_socket);
//cout<<"get transmitfile fail!"<<WSAGetLastError()<<endl;
return FALSE;
}
nRet = WSAIoctl(
m_listen_socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&g_GUIDAcceptExaddrs,
sizeof(g_GUIDAcceptExaddrs),
&lpGetAcceptExSockAddrs,
sizeof(lpGetAcceptExSockAddrs),
&dwRet,NULL,NULL);
if(nRet == SOCKET_ERROR )
{
CloseOneSocket(m_listen_socket);
//cout<<"get transmitfile fail!"<<WSAGetLastError()<<endl;
return FALSE;
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>ʱ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵġ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
void CIOCP::CheckForInvalidConnection()
{
try
{
TCHAR szMsg[256]={0};
DWORD dwNow = ::GetTickCount();
IOCP_IO_PTR lp_io = m_KeyList.m_IO;
if ( !lp_io )
return ;
for ( int i=0 ; i< MAX_LOGINUSER ; i++ )
{
if ( lp_io[i].socket != NULL && lp_io[i].socket!=INVALID_SOCKET && lp_io[i].lRandID>0 )
{
if (lp_io[i].dwAcceptTime>0 && lp_io[i].state != SOCKET_STATE_CONNECT_AND_READ )
{
/*
op_len = sizeof(op);
nRet = getsockopt( lp_io[i].socket, SOL_SOCKET, SO_CONNECT_TIME, (char*)&op, &op_len );
if( SOCKET_ERROR == nRet )
{
continue;
}
if( op != 0xffffffff && op > 3 ) //3<><33><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
{
sprintf(szMsg , "[%d]%s:%d <20><><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD><CAB1>" , lp_io[i].m_lLocalPort,lp_io[i].m_szIP,lp_io[i].m_lPort);
m_pDlg->AddLog(szMsg);
closesocket( lp_io[i].socket );
}
*/
if ( dwNow - lp_io[i].dwAcceptTime >5000 ) //10<31><30><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
{
_stprintf(szMsg , _T("[%d]%s:%d <20><><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD><CAB1>") , lp_io[i].m_lLocalPort,lp_io[i].m_szIP,lp_io[i].m_lPort);
m_pDlg->AddLog(szMsg);
closesocket( lp_io[i].socket );
}
}
if ( lp_io[i].state == SOCKET_STATE_CONNECT_AND_READ )
{
if ( lp_io[i].dwEndRecvFrame>0 )
{
if ( dwNow - lp_io[i].dwEndRecvFrame > RECVREFRESH_TIMEOUT )
{
lp_io[i].m_lID = 199992; //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>ı<EFBFBD>־
closesocket( lp_io[i].socket );
}
}
else
{
if ( dwNow - lp_io[i].dwAcceptTime > 40000 ) //30<33><30>û<EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ȷ<EFBFBD>İ<EFBFBD><C4B0>ͳ<EFBFBD>ʱ
{
_stprintf(szMsg , _T("[%d]%s:%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>ʱ<EFBFBD><CAB1>") , lp_io[i].m_lLocalPort,lp_io[i].m_szIP,lp_io[i].m_lPort);
m_pDlg->AddLog(szMsg);
closesocket( lp_io[i].socket );
}
}
}
}
}
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>ע<EFBFBD><EFBFBD>FD_ACCEPTG<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>m_h_accept_event<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻĺľ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>֪ͨ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::RegAcceptEvent()
{
int nRet;
m_h_accept_event = CreateEvent( NULL, FALSE, FALSE, NULL );
if( NULL == m_h_accept_event )
{
return FALSE;
}
nRet = WSAEventSelect( m_listen_socket, m_h_accept_event, FD_ACCEPT );
if( nRet != 0 )
{
CloseHandle( m_h_accept_event );
return FALSE;
}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀͻ<EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD>PORT
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::GetAddrAndPort(char*buf,char ip[],UINT &port)
{
int len = BUFFER_SIZE - sizeof( SOCKADDR_IN ) - 16;
char *lp_buf = buf + len; //ֱ<>Ӷ<EFBFBD>ȡԶ<C8A1>˵<EFBFBD>ַ
SOCKADDR_IN addr;
memcpy( &addr, lp_buf, sizeof( SOCKADDR_IN ) );
port = ntohl( addr.sin_port );
strcpy( ip, inet_ntoa( addr.sin_addr ) );
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ˿ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD>10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
BOOL CIOCP::Init()
{
BOOL b1;
BOOL b2;
WSAData data;
if( WSAStartup( MAKEWORD(2,2),&data) != 0 )
{
//cout<<"WSAStartup fail!"<<WSAGetLastError() << endl;
return FALSE;
}
2025-01-03 16:47:25 +08:00
m_KeyList.Init(m_pDlg);
m_h_iocp = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, NULL, 0 );
if( NULL == m_h_iocp )
{
//cout << "CreateIoCompletionPort() failed: " << GetLastError() << endl;
return FALSE;
}
if( !StartThread() )
{
//cout<<"start thread fail!"<<endl;
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
return FALSE;
}
if( !InitSocket() )
{
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
return FALSE;
}
if ( !BindAndListenSocket() ) //<2F>󶨶˿<F3B6A8B6>1
{
Close();
return FALSE;
}
m_bInitSocket2=false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7890<39>˿<EFBFBD>
/*
#ifndef UNICODE
if ( !BindAndListenSocket2()) //<2F>󶨶˿<F3B6A8B6>2
{
Close();
return FALSE;
}
#endif
*/
if( !m_bInitSocket && !m_bInitSocket2 ) //<2F><><EFBFBD><EFBFBD><EFBFBD>˿ڳ<CBBF>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
{
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
//CloseMainSocket();
return FALSE;
}
if ( !GetFunPointer() )
{
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
//CloseMainSocket();
return FALSE;
}
b1 = true;
if (m_bInitSocket)
b1=PostAcceptEx();
b2 = true;
if (m_bInitSocket2)
b2=PostAcceptEx2();
if ( !b1 && !b2 )
{
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
//CloseMainSocket();
return FALSE;
}
b1 = true;
if (m_bInitSocket)
b1=RegAcceptEvent();
b2 = true;
if (m_bInitSocket2)
b1=RegAcceptEvent2();
if ( !b1 && !b2 )
{
Close();
//PostQueuedCompletionStatus( m_h_iocp, 0, NULL, NULL );
//CloseHandle( m_h_iocp );
//CloseMainSocket();
return FALSE;
}
m_bInit = true;
m_bQuit = false; //<2F><><EFBFBD>̲߳<DFB3><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
m_h_MainLoop = CreateThread( NULL, 0, MainLoop, (LPVOID)this, 0, NULL );
if ( m_h_MainLoop == INVALID_HANDLE_VALUE ) //<2F><><EFBFBD>̴߳<DFB3><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
{
this->Close();
return false;
}
//if( m_bInitSocket2 )
//{
m_h_MainLoop2 = CreateThread( NULL, 0, MainLoop2, (LPVOID)this, 0, NULL );
if ( m_h_MainLoop2 == INVALID_HANDLE_VALUE ) //<2F><><EFBFBD>̴߳<DFB3><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
{
this->Close();
return false;
}
//}
return TRUE;
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>FALSE
-------------------------------------------------------------------------------------------*/
DWORD CIOCP::MainLoop(LPVOID lp_param)
{
try
{
AutoCoInitializeEx AutoCoInit; //<2F>Զ<EFBFBD><D4B6><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com<6F><6D><EFBFBD><EFBFBD>
CIOCP * piocp = (CIOCP *)lp_param;
DWORD dwRet;
while( !piocp->m_bQuit )
{
dwRet = WaitForSingleObject( piocp->m_h_accept_event, 300 );
switch( dwRet )
{
case WAIT_FAILED:
{
CString str;
str.Format( _T("Accept_Event Error:%d") , GetLastError());
piocp->m_pDlg->AddLog(str);
piocp->m_pDlg->ON_TD_StopAll2(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
piocp->PostAcceptEx();
//AfxMessageBox( _T("accept_event Error!") );
//PostQueuedCompletionStatus( m_h_iocp, 0, 0, NULL );
//return FALSE;
}
break;
case WAIT_TIMEOUT:
{
//CheckForInvalidConnection();
}
break;
case WAIT_OBJECT_0: //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6>ù<EFBFBD><C3B9>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ٴη<D9B4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
piocp->PostAcceptEx();
}
break;
}
/*
#ifndef UNICODE
dwRet = WaitForSingleObject( piocp->m_h_accept_event2, 300 );
switch( dwRet )
{
case WAIT_FAILED:
{
AfxMessageBox( _T("accept_event2 Error!") );
//PostQueuedCompletionStatus( m_h_iocp, 0, 0, NULL );
//return FALSE;
}
break;
case WAIT_TIMEOUT:
{
//CheckForInvalidConnection();
}
break;
case WAIT_OBJECT_0: //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6>ù<EFBFBD><C3B9>˵<EFBFBD><CBB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ٴη<D9B4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
piocp->PostAcceptEx2();
}
break;
}
#endif
*/
/*
nCount ++;
if ( nCount>5 ) //ÿ5<C3BF><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>γ<EFBFBD>ʱ
{
nCount=0;
//ÿ<><C3BF>event<6E>ȴ<EFBFBD>1<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EBA3AC><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>socket
piocp->CheckForInvalidConnection();
}
*/
}
return TRUE;
}
catch(...)
{
LOG_APPERROR(_T("T"));
return false;
}
}
/*-------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̺߳<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
-------------------------------------------------------------------------------------------*/
DWORD CIOCP::CompletionRoutine(LPVOID lp_param)
{
USES_CONVERSION;
try
{
AutoCoInitializeEx AutoCoInit; //<2F>Զ<EFBFBD><D4B6><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com<6F><6D><EFBFBD><EFBFBD>
CIOCP* lp_this = (CIOCP*)lp_param;
int nRet;
BOOL bRet;
DWORD dwBytes = 0;
HANDLE hRet;
IOCP_KEY_PTR lp_key = NULL;
IOCP_IO_PTR lp_io = NULL;
LPWSAOVERLAPPED lp_ov = NULL;
IOCP_KEY_PTR lp_new_key = NULL;
while( TRUE )
{
bRet = GetQueuedCompletionStatus( lp_this->m_h_iocp, &dwBytes, (PULONG_PTR)&lp_key, &lp_ov, INFINITE );
if ( lp_this->m_bQuit ) //<2F>յ<EFBFBD><D5B5>˳<EFBFBD><CBB3>ź<EFBFBD>
return 0;
lp_io = (IOCP_IO_PTR)lp_ov;
if ( lp_io && !AfxIsValidAddress(&lp_io->operation,4,true) ) //<2F>յ<EFBFBD><D5B5><EFBFBD>lp_io<69><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
continue;
if ( (bRet==0 || dwBytes ==0 ) && lp_io && lp_io->operation== IOCP_WRITE ) //ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>Write
{
lp_this->HandleData( lp_io, lp_key, IOCP_COMPLETE_WRITE );
continue;
}
if( bRet == 0 )
{
if ( lp_key && lp_io && lp_io->lRandID>0 )
{
lp_this->m_KeyList.RemoveAt_IO( lp_io );
lp_this->m_KeyList.RemoveAt_Key( lp_key );
continue;
}
if ( (!lp_key && !lp_io) )
{
continue;
//return 0; //<2F><><EFBFBD>˳<EFBFBD>
}
//cout << "GetQueuedCompletionStatus() failed: " << GetLastError() << endl;
//continue;
}
if( NULL == lp_key )
{
continue;
//return 0;
}
if( lp_io == NULL )
{
//cout<<"recv a null CIoContext!"<<endl;
continue;
}
if ( lp_io&& lp_io->operation!=IOCP_WRITE && (lp_io< &lp_this->m_KeyList.m_IO[0] || lp_io>&lp_this->m_KeyList.m_IO[MAX_LOGINUSER]) )
continue;
if ( lp_key && (lp_key< &lp_this->m_KeyList.m_Key[0] || lp_key>&lp_this->m_KeyList.m_Key[MAX_LOGINUSER]) )
continue;
if( ( IOCP_ACCEPT != lp_io->operation ) && ( 0 == dwBytes ) )
{
closesocket( lp_io->socket );
//lp_this->m_io_group.RemoveAt( lp_io );
//lp_this->m_key_group.RemoveAt( lp_key );
lp_this->m_KeyList.RemoveAt_IO( lp_io );
lp_this->m_KeyList.RemoveAt_Key( lp_key );
//MSG("һ<><D2BB><EFBFBD>û<EFBFBD><C3BB>˳<EFBFBD><CBB3><EFBFBD>");
continue;
}
switch( lp_io->operation )
{
case IOCP_ACCEPT:
{
//cout<<"<22><><EFBFBD>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<<endl;
lp_io->state = SOCKET_STATE_CONNECT;
if( dwBytes > 0 )
{
lp_io->state = SOCKET_STATE_CONNECT_AND_READ;
//cout<<"<22><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<<endl;
}
//ȡIP<49><50>ַ<EFBFBD><D6B7><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>Ϣ
SOCKADDR *local=NULL;
SOCKADDR *remote=NULL;
int local_len;
int remote_len;
lp_this->lpGetAcceptExSockAddrs(lp_io->buf,0,sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,&local,&local_len,&remote,&remote_len);
SOCKADDR_IN * pAA = ((SOCKADDR_IN *)local);
SOCKADDR_IN * pBB = ((SOCKADDR_IN *)remote);
#ifdef UNICODE
_tcscpy(lp_io->m_szIP,A2W(inet_ntoa(pBB->sin_addr)));
#else
strcpy(lp_io->m_szIP,inet_ntoa(pBB->sin_addr));
#endif
lp_io->m_lPort = ntohs(pBB->sin_port);
lp_io->m_lLocalPort = ntohs(pAA->sin_port);
#ifdef UNICODE
if (lp_io->m_lLocalPort == DEFAULT_SERVERPORT_UNI )
#else
if (lp_io->m_lLocalPort == DEFAULT_LISTENPORT )
#endif
{
nRet = setsockopt(
lp_io->socket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
( char* )&lp_this->m_listen_socket,
sizeof( lp_this->m_listen_socket ) );
}
else
{
nRet = setsockopt(
lp_io->socket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
( char* )&lp_this->m_listen_socket2,
sizeof( lp_this->m_listen_socket2 ) );
}
if( SOCKET_ERROR == nRet )
{
closesocket( lp_io->socket );
//lp_this->m_io_group.RemoveAt( lp_io );
lp_this->m_KeyList.RemoveAt_IO( lp_io );
//cout<<"update socket fail!"<<WSAGetLastError()<<endl;
continue;
}
//lp_new_key = lp_this->m_key_group.GetBlank();
lp_new_key = lp_this->m_KeyList.GetBlank_Key();
if( lp_new_key == NULL )
{
closesocket( lp_io->socket );
continue;
}
lp_new_key->socket = lp_io->socket;
lp_io->pKey = lp_new_key; //<2F><>¼<EFBFBD><C2BC>Ӧ<EFBFBD><D3A6>key<65><79><EFBFBD><EFBFBD>
lp_io->dwAcceptTime = ::GetTickCount(); //Accept<70><74>ʱ<EFBFBD><CAB1>
//<2F><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>SOCKETͬ<54><CDAC><EFBFBD>ɶ˿ڹ<CBBF><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hRet = CreateIoCompletionPort(
2025-01-03 16:47:25 +08:00
( HANDLE )lp_io->socket,
lp_this->m_h_iocp,
(ULONG_PTR)lp_new_key,0 );
2025-01-03 16:47:25 +08:00
if( NULL == hRet )
{
lp_this->m_KeyList.RemoveAt_Key( lp_new_key );
lp_this->m_KeyList.RemoveAt_IO( lp_io );
closesocket( lp_io->socket );
continue;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lp_this->HandleData( lp_io, lp_new_key,IOCP_COMPLETE_ACCEPT );
bRet = lp_this->DataAction( lp_io, lp_new_key );
if( FALSE == bRet )
{
continue;
}
}
break;
case IOCP_READ:
{
if( SOCKET_STATE_CONNECT_AND_READ != lp_io->state )
{
lp_io->state = SOCKET_STATE_CONNECT_AND_READ;
}
lp_io->wsaBuf.len = dwBytes;
lp_this->HandleData( lp_io, lp_key, IOCP_COMPLETE_READ );
bRet = lp_this->DataAction( lp_io, lp_key );
if( FALSE == bRet )
{
continue;
}
}
break;
case IOCP_WRITE:
{
lp_this->HandleData( lp_io, lp_key, IOCP_COMPLETE_WRITE );
if( FALSE == bRet )
{
continue;
}
}
break;
default:
{
continue;
}
break;
}
}
return 0;
}
catch (... )
{
LOG_APPERROR(_T("T"));
return 1;
}
}
void CIOCP::CloseMainSocket()
{
CloseOneSocket(m_listen_socket);
CloseOneSocket(m_listen_socket2);
}
BOOL CIOCP::BindAndListenSocket2()
{
SOCKADDR_IN addr;
memset( &addr, 0, sizeof(SOCKADDR_IN) );
addr.sin_family = AF_INET;
//addr.sin_addr.s_addr = inet_addr( ADDR );
//addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = m_pDlg->m_Setup.addr;
addr.sin_port = htons( DEFAULT_LISTENPORT2 );
int nRet;
nRet = bind( m_listen_socket2, (SOCKADDR*)&addr, sizeof( SOCKADDR ) );
if( SOCKET_ERROR == nRet )
{
//cout<<"bind fail!"<<endl;
return FALSE;
}
nRet = listen( m_listen_socket2, 20 );
if( SOCKET_ERROR == nRet )
{
//cout<<"listen fail!"<<endl;
return FALSE;
}
m_bInitSocket2 = true;
return TRUE;
}
void CIOCP::CloseOneSocket(SOCKET &socket)
{
if ( socket != INVALID_SOCKET )
{
closesocket(socket);
socket = INVALID_SOCKET;
}
}
BOOL CIOCP::PostAcceptEx2()
{
#ifdef _DEBUG
int count = 10;
#else
int count = 30;
#endif
DWORD dwBytes;
BOOL bRet;
for( int i = 0; i < count; i++ )
{
SOCKET socket = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
if( INVALID_SOCKET == socket )
{
//cout<<"post accept ex fail!"<<WSAGetLastError()<<endl;
continue;
}
/*
//<2F><><EFBFBD><EFBFBD>Socket
u_long ulTemp=1; //<2F><>SOCKET<45><54><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>SOCKET
//u_long ulTemp=0; //<2F><>SOCKET<45><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>SOCKET
ioctlsocket( socket,FIONBIO,&ulTemp );
ulTemp=64000;
setsockopt( socket , SOL_SOCKET, SO_SNDBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><><EFBFBD>
ulTemp=64000;
setsockopt( socket , SOL_SOCKET, SO_RCVBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><><EFBFBD>
setsockopt( socket, SOL_SOCKET, SO_DONTLINGER,(const char *)&ulTemp,sizeof(BOOL));
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=0;//(<28><>closesocket()<29><><EFBFBD><EFBFBD>,<2C><><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// <20><><EFBFBD><EFBFBD>m_sLinger.l_onoff=0;<3B><><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>2.)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ;
m_sLinger.l_linger=0;//(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ϊ5<CEAA><35>)
int iLen=sizeof(m_sLinger);
int i = setsockopt(socket,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
*/
//IOCP_IO_PTR lp_io = m_io_group.GetBlank();
IOCP_IO_PTR lp_io = m_KeyList.GetBlank_IO();
if ( lp_io != NULL )
{
InitIoContext( lp_io );
lp_io->socket = socket;
lp_io->operation = IOCP_ACCEPT;
lp_io->state = SOCKET_STATE_NOT_CONNECT;
/////////////////////////////////////////////////
bRet = lpAcceptEx(
m_listen_socket2,
lp_io->socket,
lp_io->buf,
// lp_io->wsaBuf.len - 2 * ( sizeof(SOCKADDR_IN) + 16 ),
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,&lp_io->ol);
if( ( bRet == FALSE ) && ( WSA_IO_PENDING != WSAGetLastError() ) )
{
closesocket( socket );
//m_io_group.RemoveAt( lp_io );
m_KeyList.RemoveAt_IO( lp_io );
//cout<<"post acceptex fail:"<<WSAGetLastError()<<endl;
continue;
}
}
else
{
int i=10;
}
}
return TRUE;
}
BOOL CIOCP::RegAcceptEvent2()
{
int nRet;
m_h_accept_event2 = CreateEvent( NULL, FALSE, FALSE, NULL );
if( NULL == m_h_accept_event2 )
{
return FALSE;
}
nRet = WSAEventSelect( m_listen_socket2, m_h_accept_event2, FD_ACCEPT );
if( nRet != 0 )
{
CloseHandle( m_h_accept_event2 );
return FALSE;
}
return TRUE;
}
long CIOCP::GetFrame(IOCP_IO_PTR lp_io)
{
try
{
int iGetFrame=0;
for ( int i=0 ; i<lp_io->lRecvLen ; i++ )
{
if ( i+sizeof(Socket_Head) > (DWORD)lp_io->lRecvLen )
{
//i--;
break;
}
Socket_Head SHead={0};
memcpy(&SHead,lp_io->buf+i,sizeof(Socket_Head)); i=i+sizeof(Socket_Head);
long lGetLen=SHead.lFrameLen;
if ( SHead.bCompress )
lGetLen = SHead.lCompressLen;
if ( SHead.lFuncType <=0 || SHead.lFuncType > 100000 ||
SHead.lCompressLen<0 || SHead.lCompressLen>BUFFER_SIZE ||
SHead.lFrameLen<0 || SHead.lFrameLen>BUFFER_SIZE ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>յ<EFBFBD><D5B5><EFBFBD>֡<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return -1; //<2F><><EFBFBD>ݲ<EFBFBD><DDB2>ԣ<EFBFBD><D4A3>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
}
if ( i+lGetLen>lp_io->lRecvLen) //<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
{
i=i-sizeof(Socket_Head);
//i--;
break;
}
lp_io->dwEndRecvFrame = ::GetTickCount();
if ( SHead.lFuncType == SMSFUNC_TEST && lp_io->m_lUserID>0 ) //ֱ<>ӻظ<D3BB>SMSFunc_Test
{
ANS_Test * pTestRet = new ANS_Test;
pTestRet->lTemp = ::GetTickCount();
CSmsCenterDlg::SendFrame(lp_io, SMSFUNC_TEST , (BYTE*)pTestRet , sizeof(ANS_Test) ); //<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
}
else
{
IOCP_SQL_PTR pSql = m_KeyList.GetBlank_SQL();
if ( pSql )
{
try
{
//CProcessSocket * pProcess = m_KeyList.GetBlank_Process();
CProcessSocket * pProcess = new CProcessSocket;
if ( pProcess )
{
BOOL bOK = true;
pProcess->SetDlg(m_pDlg);
pProcess->IOCP_setSQL(pSql);
Cmpp_Head head={0};
bOK = pProcess->IOCP_GetFrameData(lp_io , SHead , head,(BYTE*)(lp_io->buf+i) , lGetLen);
if ( bOK ) //<2F><><EFBFBD><EFBFBD><EFBFBD>̴߳<DFB3><CCB4><EFBFBD>
{
iGetFrame ++;
QueueUserWorkItem(CProcessSocket::IOCP_Process, (PVOID)pProcess, WT_EXECUTELONGFUNCTION);
}
else
{
//<2F>ͷ<EFBFBD><CDB7><EFBFBD>Դ
pProcess->m_bUse = false;
pProcess->m_lRandID=0;
pSql->bUse = false;
pSql->lRandID = 0;
//<2F><>ʱ<EFBFBD><CAB1>ɾ<EFBFBD><C9BE><EFBFBD>˶<EFBFBD><CBB6>񣬷<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
delete pProcess; //ɾ<><C9BE>new<65>Ķ<EFBFBD><C4B6><EFBFBD>
}
}
else
{
AfxMessageBox(_T("new Process error"));
}
}
catch(...)
{
LOG_APPERROR(_T("T"));
pSql->bUse = false; //<2F><><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ģʽ
pSql->lRandID = 0;
}
}
}
i=i+lGetLen;
i=i-1;
}
if ( i >= lp_io->lRecvLen ) //<2F><><EFBFBD>ݸոպ<D5B8>
{
lp_io->lRecvLen = 0;
}
else
{
if ( i> 0 )
{
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lp_io->lRecvLen = lp_io->lRecvLen-i;
memcpy(lp_io->buf , lp_io->buf+i , lp_io->lRecvLen );
}
}
return iGetFrame;
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
return -1;
}
long CIOCP::GetFrame_Cmpp(IOCP_IO_PTR lp_io)
{
try
{
int iGetFrame=0;
for ( int i=0 ; i<lp_io->lRecvLen ; i++ )
{
if ( i+sizeof(Cmpp_Head) > (DWORD)lp_io->lRecvLen )
{
//i--;
break;
}
Cmpp_Head SHead={0};
memcpy(&SHead,lp_io->buf+i,sizeof(Cmpp_Head)); i=i+sizeof(Cmpp_Head);
SHead.Command_Id = ntohl(SHead.Command_Id);
SHead.Sequence_Id= ntohl(SHead.Sequence_Id);
SHead.Total_Length = ntohl(SHead.Total_Length);
long lGetLen=SHead.Total_Length-sizeof(Cmpp_Head);
if ( SHead.Total_Length <=0 || SHead.Total_Length>BUFFER_SIZE ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>յ<EFBFBD><D5B5><EFBFBD>֡<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return -1; //<2F><><EFBFBD>ݲ<EFBFBD><DDB2>ԣ<EFBFBD><D4A3>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
}
if ( i+lGetLen>lp_io->lRecvLen) //<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
{
i=i-sizeof(Cmpp_Head);
//i--;
break;
}
lp_io->dwEndRecvFrame = ::GetTickCount();
/*
if ( SHead.Command_Id == CMPP_ACTIVE_TEST && lp_io->m_lUserID>0 ) //ֱ<>ӻظ<D3BB>SMSFunc_Test
{
Cmpp_Active_Test_Resp * pActive = new Cmpp_Active_Test_Resp;
memset(pActive , 0 , sizeof(Cmpp_Active_Test_Resp));
CSmsCenterDlg::SendFrame_Cmpp(lp_io, CMPP_ACTIVE_TEST_RESP ,SHead.Sequence_Id, (BYTE*)pActive , sizeof(Cmpp_Active_Test_Resp) ); //<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
}
else
{
IOCP_SQL_PTR pSql = m_KeyList.GetBlank_SQL();
if ( pSql )
{
//CProcessSocket * pProcess = m_KeyList.GetBlank_Process();
CProcessSocket * pProcess = new CProcessSocket;
if ( pProcess )
{
BOOL bOK = true;
pProcess->SetDlg(m_pDlg);
pProcess->IOCP_setSQL(pSql);
Socket_Head head={0};
bOK = pProcess->IOCP_GetFrameData(lp_io , head,SHead , (BYTE*)(lp_io->buf+i) , lGetLen);
if ( bOK ) //<2F><><EFBFBD><EFBFBD><EFBFBD>̴߳<DFB3><CCB4><EFBFBD>
{
iGetFrame ++;
QueueUserWorkItem(CProcessSocket::IOCP_Process, (PVOID)pProcess, WT_EXECUTELONGFUNCTION);
}
else
{
//<2F>ͷ<EFBFBD><CDB7><EFBFBD>Դ
pProcess->m_bUse = false;
pProcess->m_lRandID=0;
pSql->bUse = false;
pSql->lRandID = 0;
//<2F><>ʱ<EFBFBD><CAB1>ɾ<EFBFBD><C9BE><EFBFBD>˶<EFBFBD><CBB6>񣬷<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
delete pProcess; //ɾ<><C9BE>new<65>Ķ<EFBFBD><C4B6><EFBFBD>
}
}
}
}
*/
i=i+lGetLen;
i=i-1;
}
if ( i >= lp_io->lRecvLen ) //<2F><><EFBFBD>ݸոպ<D5B8>
{
lp_io->lRecvLen = 0;
}
else
{
if ( i> 0 )
{
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lp_io->lRecvLen = lp_io->lRecvLen-i;
memcpy(lp_io->buf , lp_io->buf+i , lp_io->lRecvLen );
}
}
return iGetFrame;
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
return -1;
}
void CIOCP::SetDlg(CSmsCenterDlg *pDlg)
{
m_pDlg = pDlg;
}
void CIOCP::InitIoContext_Send(IOCP_IO_SEND_PTR lp_io)
{
memset( &lp_io->ol, 0, sizeof( WSAOVERLAPPED ) );
}
void CIOCP::CheckForInvalidSQLConnection()
{
try
{
TCHAR szMsg[256]={0};
DWORD dwNow = ::GetTickCount();
/*
LPVOID * lpProcess = m_KeyList.m_Process;
if ( lpProcess )
{
for ( int i=0 ; i<MAX_SQLCONNECT; i++ )
{
CProcessSocket * pSocket = (CProcessSocket *)lpProcess[i];
if ( pSocket && pSocket->m_adoConnection.IsOpen() )
{
if ( pSocket->m_bUse && pSocket->m_lRandID>0 ) //<2F><>ʹ<EFBFBD><CAB9><EFBFBD>е<EFBFBD>SQL,40<34><30><EFBFBD>ӳ<EFBFBD>ʱ
{
if ( dwNow - pSocket->m_dwEndUse > SQL_TIMEOUT_USE )
{
pSocket->m_AdoRS.Close();
pSocket->m_AdoRS2.Close();
pSocket->m_adoConnection.Close();
pSocket->m_bUse = false;
pSocket->m_lRandID = 0;
sprintf(szMsg, "SQL:%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" , i );
m_pDlg->AddLog(szMsg);
}
}
else
{
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>е<EFBFBD>SQL,20<32><30><EFBFBD>ӳ<EFBFBD>ʱ
if ( dwNow - pSocket->m_dwEndUse > SQL_TIMEOUT_DISUSE )
{
pSocket->m_AdoRS.Close();
pSocket->m_AdoRS2.Close();
pSocket->m_adoConnection.Close();
pSocket->m_bUse = false;
pSocket->m_lRandID = 0;
sprintf(szMsg, "SQL:%d <20><>ʱδʹ<CEB4>ã<EFBFBD><C3A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" , i );
m_pDlg->AddLog(szMsg);
}
}
}
}
}
*/
IOCP_SQL_PTR pSql = m_KeyList.m_SQL;
if ( pSql )
{
for ( int i=0 ; i<MAX_SQLCONNECT; i++ )
{
if ( pSql[i].adoConnection.IsOpen() )
{
if ( pSql[i].bUse && pSql[i].lRandID>0 ) //<2F><>ʹ<EFBFBD><CAB9><EFBFBD>е<EFBFBD>SQL,40<34><30><EFBFBD>ӳ<EFBFBD>ʱ
{
if ( dwNow - pSql[i].dwEndUse > SQL_TIMEOUT_USE )
{
pSql[i].adoConnection.Close();
pSql[i].bUse = false;
pSql[i].lRandID = 0;
_stprintf(szMsg, _T("SQL:%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>") , i );
m_pDlg->AddLog(szMsg);
}
}
else
{
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>е<EFBFBD>SQL,20<32><30><EFBFBD>ӳ<EFBFBD>ʱ
if ( dwNow - pSql[i].dwEndUse > SQL_TIMEOUT_DISUSE )
{
pSql[i].adoConnection.Close();
pSql[i].bUse = false;
pSql[i].lRandID = 0;
_stprintf(szMsg, _T("SQL:%d <20><>ʱδʹ<CEB4>ã<EFBFBD><C3A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>") , i );
m_pDlg->AddLog(szMsg);
}
}
}
}
}
}
catch (...)
{
LOG_APPERROR(_T("T"));
}
}
DWORD WINAPI CIOCP::MainLoop2(LPVOID lp_param)
{
try
{
AutoCoInitializeEx AutoCoInit; //<2F>Զ<EFBFBD><D4B6><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Com<6F><6D><EFBFBD><EFBFBD>
CIOCP * piocp = (CIOCP *)lp_param;
int nCount = 0;
int nCount2= 0;
while( !piocp->m_bQuit )
{
nCount ++;
if ( nCount>10 ) //ÿ5<C3BF><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>γ<EFBFBD>ʱ
{
nCount=0;
piocp->CheckForInvalidConnection();
}
nCount2 ++;
if ( nCount2>120 ) //ÿ1<C3BF><31><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>һ<EFBFBD>γ<EFBFBD>ʱ
{
nCount2=0;
piocp->CheckForInvalidSQLConnection();
}
Sleep(500);
}
return TRUE;
}
catch(...)
{
LOG_APPERROR(_T("T"));
return false;
}
}