884 lines
20 KiB
C++
884 lines
20 KiB
C++
|
// QQTX.cpp: implementation of the CQQTX class.
|
|||
|
//
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
#include "QQTX.h"
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
#ifdef _DEBUG
|
|||
|
#undef THIS_FILE
|
|||
|
static char THIS_FILE[]=__FILE__;
|
|||
|
#define new DEBUG_NEW
|
|||
|
#endif
|
|||
|
*/
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
// Construction/Destruction
|
|||
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include <stdlib.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include "..\..\..\public\md53\\md5_L.h"
|
|||
|
|
|||
|
|
|||
|
CQQTX::CQQTX()
|
|||
|
{
|
|||
|
m_hSocket = INVALID_SOCKET;
|
|||
|
memset( m_szIP , 0 , sizeof(m_szIP) );
|
|||
|
m_lPort = 0;
|
|||
|
m_bQuitThread = false;
|
|||
|
m_dwEndSendTime = 0;
|
|||
|
m_dwEndRecvTime = 0;
|
|||
|
m_dwTestCount = 0;
|
|||
|
m_bRecvFrame = false;
|
|||
|
|
|||
|
m_lID = 1;
|
|||
|
m_pRecvProc = NULL;
|
|||
|
m_bConnect = false;
|
|||
|
m_bLoginQQTX= -1;
|
|||
|
m_bInitQQTX = false;
|
|||
|
|
|||
|
memset(m_szQQTXIP ,0,sizeof(m_szQQTXIP));
|
|||
|
memset(m_szQQTXUser ,0,sizeof(m_szQQTXUser));
|
|||
|
memset(m_szQQTXPasswd,0,sizeof(m_szQQTXPasswd));
|
|||
|
memset(m_szQQTXKey ,0,sizeof(m_szQQTXKey));
|
|||
|
m_lConnectType = 2; //Ĭ<><C4AC><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD>뷢<EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
WSADATA wsaData; //<2F><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>socket<65>Ľṹ
|
|||
|
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʼ<EFBFBD><CABC>SOCKET<45><54><EFBFBD><EFBFBD>
|
|||
|
int iTemp=WSAStartup(0x0101,&wsaData); //<2F><>ʼ<EFBFBD><CABC>socket<65><74><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
InitializeCriticalSection(&m_CriDeliverList);
|
|||
|
InitializeCriticalSection(&m_CriErrMsg);
|
|||
|
InitializeCriticalSection(&m_CriSendFrame);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
m_lSendID = 1;
|
|||
|
m_pDeliverList = new QQTX_Deliver_List[QQTX_MAX_DELIVER];
|
|||
|
m_lDeliverList=0;
|
|||
|
for ( int i=0 ; i<QQTX_MAX_DELIVER ; i++ )
|
|||
|
{
|
|||
|
m_pDeliverList[i].lSendID = 0;
|
|||
|
}
|
|||
|
|
|||
|
m_dwEndSocketSendTime = 0;
|
|||
|
m_lSendInterval = 0;
|
|||
|
|
|||
|
m_hThread = INVALID_HANDLE_VALUE;
|
|||
|
m_hThread_Send = INVALID_HANDLE_VALUE;
|
|||
|
}
|
|||
|
|
|||
|
CQQTX::~CQQTX()
|
|||
|
{
|
|||
|
Stop();
|
|||
|
|
|||
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( m_pDeliverList )
|
|||
|
{delete [] m_pDeliverList;m_pDeliverList=NULL;}
|
|||
|
|
|||
|
DeleteCriticalSection(&m_CriDeliverList);
|
|||
|
|
|||
|
DeleteCriticalSection(&m_CriErrMsg);
|
|||
|
DeleteCriticalSection(&m_CriSendFrame);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//<2F>˳<EFBFBD>Socket
|
|||
|
WSACleanup();
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::Connect(const char *pAddr, long lPort, BOOL bReConnect)
|
|||
|
{
|
|||
|
if ( !bReConnect && m_hSocket!=INVALID_SOCKET) //<2F><><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
this->Stop(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ֹͣ
|
|||
|
|
|||
|
strcpy( m_szIP,pAddr );
|
|||
|
m_lPort = lPort;
|
|||
|
|
|||
|
sockaddr_in sAddr;
|
|||
|
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
|
|||
|
sAddr.sin_family=AF_INET;
|
|||
|
sAddr.sin_port=0;
|
|||
|
sAddr.sin_addr.s_addr=htonl(INADDR_ANY);
|
|||
|
if (bind(m_hSocket,(LPSOCKADDR)&sAddr,sizeof(sAddr))==SOCKET_ERROR)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
sAddr.sin_port=htons((unsigned short)lPort);
|
|||
|
sAddr.sin_addr.s_addr=inet_addr(pAddr);
|
|||
|
if (sAddr.sin_addr.s_addr == INADDR_NONE)
|
|||
|
{
|
|||
|
LPHOSTENT lphost;
|
|||
|
lphost = gethostbyname(pAddr);
|
|||
|
if (lphost != NULL)
|
|||
|
sAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
|
|||
|
else
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
if (connect(m_hSocket,(LPSOCKADDR)&sAddr,sizeof(sAddr))==SOCKET_ERROR)
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//<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( m_hSocket,FIONBIO,&ulTemp );
|
|||
|
ulTemp=1024000;
|
|||
|
setsockopt( m_hSocket , SOL_SOCKET, SO_SNDBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><>緳<EFBFBD>
|
|||
|
ulTemp=1024000;
|
|||
|
setsockopt( m_hSocket , SOL_SOCKET, SO_RCVBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><>緳<EFBFBD>
|
|||
|
|
|||
|
m_bQuitThread = false;
|
|||
|
DWORD dwTemp;
|
|||
|
HANDLE m_hThread=CreateThread(NULL,0,SocketRecv,(LPVOID)this,0,&dwTemp);
|
|||
|
// if ( !::AfxBeginThread((AFX_THREADPROC)CNetSocket::SocketRecv,(LPVOID)this,THREAD_PRIORITY_LOWEST) )
|
|||
|
if ( m_hThread == INVALID_HANDLE_VALUE )
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
HANDLE m_hThread_Send=CreateThread(NULL,0,SocketSend,(LPVOID)this,0,&dwTemp);
|
|||
|
// if ( !::AfxBeginThread((AFX_THREADPROC)CNetSocket::SocketRecv,(LPVOID)this,THREAD_PRIORITY_LOWEST) )
|
|||
|
if ( m_hThread_Send == INVALID_HANDLE_VALUE )
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
//SetThreadPriority(m_hThread,THREAD_PRIORITY_LOWEST); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
|||
|
m_bConnect = true;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::Connect2()
|
|||
|
{
|
|||
|
sockaddr_in sAddr;
|
|||
|
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
|
|||
|
sAddr.sin_family=AF_INET;
|
|||
|
sAddr.sin_port=0;
|
|||
|
sAddr.sin_addr.s_addr=htonl(INADDR_ANY);
|
|||
|
if (bind(m_hSocket,(LPSOCKADDR)&sAddr,sizeof(sAddr))==SOCKET_ERROR)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
sAddr.sin_port=htons((unsigned short)m_lPort);
|
|||
|
sAddr.sin_addr.s_addr=inet_addr(m_szIP);
|
|||
|
if (sAddr.sin_addr.s_addr == INADDR_NONE)
|
|||
|
{
|
|||
|
LPHOSTENT lphost;
|
|||
|
lphost = gethostbyname(m_szIP);
|
|||
|
if (lphost != NULL)
|
|||
|
sAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
|
|||
|
else
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
if (connect(m_hSocket,(LPSOCKADDR)&sAddr,sizeof(sAddr))==SOCKET_ERROR)
|
|||
|
{
|
|||
|
Close();
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//<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( m_hSocket,FIONBIO,&ulTemp );
|
|||
|
ulTemp=1024000;
|
|||
|
setsockopt( m_hSocket , SOL_SOCKET, SO_SNDBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><>緳<EFBFBD>
|
|||
|
ulTemp=1024000;
|
|||
|
setsockopt( m_hSocket , SOL_SOCKET, SO_RCVBUF ,(const char *)&ulTemp ,sizeof(ulTemp)); //<2F><>緳<EFBFBD>
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::isConnect()
|
|||
|
{
|
|||
|
return m_bConnect;
|
|||
|
}
|
|||
|
|
|||
|
void CQQTX::Stop()
|
|||
|
{
|
|||
|
m_bQuitThread = true;
|
|||
|
if (m_hThread != INVALID_HANDLE_VALUE && WaitForSingleObject(m_hThread,2000) == WAIT_TIMEOUT ) //<2F>ȴ<EFBFBD>5<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>߳<EFBFBD><DFB3>˳<EFBFBD>
|
|||
|
{
|
|||
|
TerminateThread(m_hThread,0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
|
|||
|
}
|
|||
|
m_hThread = INVALID_HANDLE_VALUE;
|
|||
|
if (m_hThread_Send != INVALID_HANDLE_VALUE && WaitForSingleObject(m_hThread_Send,2000) == WAIT_TIMEOUT ) //<2F>ȴ<EFBFBD>5<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>߳<EFBFBD><DFB3>˳<EFBFBD>
|
|||
|
{
|
|||
|
TerminateThread(m_hThread_Send,0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
|
|||
|
}
|
|||
|
m_hThread_Send = INVALID_HANDLE_VALUE;
|
|||
|
|
|||
|
Close();
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::isSocketClose(SOCKET s)
|
|||
|
{
|
|||
|
BOOL bConnDropped = FALSE;
|
|||
|
INT iRet = 0;
|
|||
|
BOOL bOK = TRUE;
|
|||
|
|
|||
|
if (s == INVALID_SOCKET)
|
|||
|
return TRUE;
|
|||
|
|
|||
|
struct timeval timeout = { 0, 0 };
|
|||
|
fd_set readSocketSet;
|
|||
|
FD_ZERO(&readSocketSet);
|
|||
|
FD_SET(s, &readSocketSet);
|
|||
|
iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
|
|||
|
bOK = (iRet > 0);
|
|||
|
if(bOK)
|
|||
|
{
|
|||
|
bOK = FD_ISSET(s, &readSocketSet);
|
|||
|
}
|
|||
|
|
|||
|
if(bOK)
|
|||
|
{
|
|||
|
CHAR szBuffer[1] = "";
|
|||
|
iRet = recv(s, szBuffer, 1, MSG_PEEK);
|
|||
|
bOK = (iRet > 0);
|
|||
|
if(!bOK)
|
|||
|
{
|
|||
|
INT iError = WSAGetLastError();
|
|||
|
bConnDropped = (( iError == WSAENETRESET) ||
|
|||
|
(iError == WSAECONNABORTED) ||
|
|||
|
(iError == WSAECONNRESET) ||
|
|||
|
(iError == WSAEINVAL) ||
|
|||
|
(iRet == 0));
|
|||
|
}
|
|||
|
}
|
|||
|
return(bConnDropped);
|
|||
|
}
|
|||
|
|
|||
|
void CQQTX::Close()
|
|||
|
{
|
|||
|
if ( m_hSocket == INVALID_SOCKET )
|
|||
|
return;
|
|||
|
|
|||
|
if ( m_hSocket != INVALID_SOCKET )
|
|||
|
closesocket(m_hSocket);
|
|||
|
|
|||
|
m_hSocket = INVALID_SOCKET;
|
|||
|
m_bConnect = false;
|
|||
|
//m_dwEndSendTime=0;
|
|||
|
//m_dwEndRecvTime=0;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::Send(SOCKET sock,BYTE *pData, long lLen)
|
|||
|
{
|
|||
|
#define SOCKET_SEND_TIMEOUT 10000 //10<31>뷢<EFBFBD>ͳ<EFBFBD>ʱ
|
|||
|
if ( sock == INVALID_SOCKET )
|
|||
|
return 0;
|
|||
|
|
|||
|
long lSended = 0;
|
|||
|
DWORD lTimeOut = ::GetTickCount();
|
|||
|
while ( 1 )
|
|||
|
{
|
|||
|
long lRet = send(sock,(char*)(pData+lSended), lLen-lSended,0);
|
|||
|
if ( lRet == SOCKET_ERROR ) //<2F><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
|
|||
|
{
|
|||
|
if ( GetLastError() != WSAEWOULDBLOCK ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return SOCKET_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
if ( lRet > 0 )
|
|||
|
{
|
|||
|
lSended += lRet;
|
|||
|
if ( lSended >= lLen )
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Sleep_Lu( 20 ); //緳<><E7B7B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>
|
|||
|
}
|
|||
|
if ( ::GetTickCount() - lTimeOut > SOCKET_SEND_TIMEOUT )
|
|||
|
break;
|
|||
|
}
|
|||
|
return lSended;
|
|||
|
}
|
|||
|
DWORD WINAPI CQQTX::SocketSend(LPVOID lParam)
|
|||
|
{
|
|||
|
CQQTX * pNet = (CQQTX *)lParam;
|
|||
|
QQTX_Data_Recv Drecv={0};
|
|||
|
while ( !pNet->m_bQuitThread )
|
|||
|
{
|
|||
|
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|||
|
Sleep_Lu(20);
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
DWORD WINAPI CQQTX::SocketRecv(LPVOID lParam)
|
|||
|
{
|
|||
|
CQQTX * pNet = (CQQTX *)lParam;
|
|||
|
QQTX_Data_Recv Drecv={0};
|
|||
|
pNet->m_dwEndRecvTime = ::GetTickCount(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>֡<EFBFBD><D6A1>ʱ<EFBFBD><CAB1>
|
|||
|
DWORD dwEndSend=GetTickCount();
|
|||
|
while ( !pNet->m_bQuitThread )
|
|||
|
{
|
|||
|
BOOL bReConnect=false;
|
|||
|
if ( isSocketClose(pNet->m_hSocket) )
|
|||
|
{
|
|||
|
pNet->Close();
|
|||
|
//<2F><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( Drecv.pRecvFrame )
|
|||
|
delete Drecv.pRecvFrame;
|
|||
|
memset(&Drecv,0,sizeof(Drecv));
|
|||
|
if ( pNet->m_bInitQQTX ) //ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD>ӵģ<D3B5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
bReConnect = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pNet->m_bLoginQQTX = -4; //<2F>Զ˶Ͽ<CBB6><CFBF><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>¼ʧ<C2BC><CAA7>
|
|||
|
}
|
|||
|
}
|
|||
|
if ( ReadFrame(pNet->m_hSocket,&Drecv) ) //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>н<EFBFBD><D0BD>յ<EFBFBD><D5B5>µ<EFBFBD>Frame
|
|||
|
{
|
|||
|
pNet->m_dwEndRecvTime = ::GetTickCount(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>֡<EFBFBD><D6A1>ʱ<EFBFBD><CAB1>
|
|||
|
pNet->m_bRecvFrame = true;
|
|||
|
pNet->RecvFrame(Drecv); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>֡
|
|||
|
Drecv.lDataLen = 0;
|
|||
|
Drecv.lRecvType = 0;
|
|||
|
if ( Drecv.pRecvFrame )
|
|||
|
{
|
|||
|
delete Drecv.pRecvFrame;
|
|||
|
Drecv.pRecvFrame = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F>жϽ<D0B6><CFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʱ
|
|||
|
//if ( pNet->m_dwEndSendTime > 0 && !pNet->m_bRecvFrame)
|
|||
|
if ( pNet->m_dwEndSendTime>0 && ::GetTickCount() - pNet->m_dwEndRecvTime >(QQTX_ACTIVE_TESTTIME*QQTX_ACTIVE_COUNTOUT+QQTX_ACTIVE_TIMEOUT) ) //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
|||
|
{
|
|||
|
pNet->m_dwEndRecvTime = ::GetTickCount()-QQTX_ACTIVE_TIMEOUT; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>
|
|||
|
pNet->Close();
|
|||
|
//<2F><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( Drecv.pRecvFrame )
|
|||
|
delete Drecv.pRecvFrame;
|
|||
|
memset(&Drecv,0,sizeof(Drecv));
|
|||
|
bReConnect = true;
|
|||
|
}
|
|||
|
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ӧ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD>Active_Testָ<74><D6B8>
|
|||
|
if ( pNet->m_dwEndSendTime > 0 )
|
|||
|
{
|
|||
|
if ( ::GetTickCount() - pNet->m_dwEndSendTime > QQTX_ACTIVE_TESTTIME ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
ULONG lSeq=0;
|
|||
|
pNet->SendFrame(pNet->m_hSocket,pNet->m_lID,pNet->m_dwEndSendTime, QQ_ACTIVE_TEST ,_T(""),lSeq );
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|||
|
//pNet->Back_Send();
|
|||
|
|
|||
|
if ( bReConnect )
|
|||
|
{
|
|||
|
for ( int i=0 ; i<30 && !pNet->m_bQuitThread; i++ ) //<2F><>ʱ5<CAB1><35>
|
|||
|
{
|
|||
|
Sleep_Lu(100);
|
|||
|
}
|
|||
|
pNet->SetErrMsg("QQTX<EFBFBD><EFBFBD>Ϣ:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
|
|||
|
if ( !pNet->m_bQuitThread )
|
|||
|
pNet->InitQQTX2(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
//Sleep_Lu(1);
|
|||
|
}
|
|||
|
if ( Drecv.pRecvFrame )
|
|||
|
delete Drecv.pRecvFrame;
|
|||
|
pNet->Close();
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
void CQQTX::SetRecvProc(QQTX_RECVPROC proc)
|
|||
|
{
|
|||
|
m_pRecvProc = proc;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::ReadFrame(SOCKET s, QQTX_Data_Recv *pRecv)
|
|||
|
{
|
|||
|
ULONG nBytes=0;
|
|||
|
ioctlsocket(s,FIONREAD, &nBytes);
|
|||
|
if (nBytes <= 0 )
|
|||
|
{
|
|||
|
Sleep_Lu(20); //û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ȴ<EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1>
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
BYTE bTemp=0;
|
|||
|
long lRet=0;
|
|||
|
switch( pRecv->lRecvType )
|
|||
|
{
|
|||
|
case 0://<2F><><EFBFBD><EFBFBD>ͷ
|
|||
|
lRet = recv(s, (char*)&bTemp,sizeof(bTemp),0);
|
|||
|
if ( lRet > 0 && bTemp==QQ_stx)
|
|||
|
{
|
|||
|
pRecv->lRecvType = 1; //<2F><>ʼ<EFBFBD><CABC><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
|
|||
|
pRecv->lDataLen = 0;
|
|||
|
if ( pRecv->pRecvFrame )
|
|||
|
{
|
|||
|
delete pRecv->pRecvFrame;
|
|||
|
pRecv->pRecvFrame = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 1: //<2F><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
|
|||
|
lRet = recv(s, (char*)&pRecv->lDataLen,sizeof(pRecv->lDataLen),0);
|
|||
|
if ( lRet > 0 )
|
|||
|
{
|
|||
|
pRecv->lDataLen = ntohl(pRecv->lDataLen);
|
|||
|
if ( pRecv->lDataLen > 0 && pRecv->lDataLen<4096000)
|
|||
|
{
|
|||
|
pRecv->pRecvFrame = new BYTE[pRecv->lDataLen];
|
|||
|
*((BYTE*)pRecv->pRecvFrame) = QQ_stx; //<2F><><EFBFBD><EFBFBD>ǰ4<C7B0><34><EFBFBD>ֽ<EFBFBD>
|
|||
|
*((ULONG*)(pRecv->pRecvFrame+1)) = pRecv->lDataLen; //<2F><><EFBFBD><EFBFBD>ǰ4<C7B0><34><EFBFBD>ֽ<EFBFBD>
|
|||
|
pRecv->lRecvLen = sizeof(pRecv->lDataLen)+1;
|
|||
|
|
|||
|
pRecv->lRecvType = 2; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 2: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
ULONG lBeRecv = pRecv->lDataLen-pRecv->lRecvLen;
|
|||
|
lRet = recv(s,(char*)pRecv->pRecvFrame+pRecv->lRecvLen , lBeRecv ,0);
|
|||
|
if ( lRet > 0 )
|
|||
|
pRecv->lRecvLen += lRet ;
|
|||
|
if ( pRecv->lRecvLen == pRecv->lDataLen ) //Frame <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
pRecv->lDataLen = 0; //<2F><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
if ( pRecv->lDataLen <= 0 && nBytes<= sizeof(pRecv->lDataLen) ) //δ<>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
return false;
|
|||
|
|
|||
|
long lRet;
|
|||
|
if (pRecv->lDataLen <= 0 ) //δ<>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ڿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
lRet = recv(s, (char*)&pRecv->lDataLen,sizeof(pRecv->lDataLen),0);
|
|||
|
if ( lRet > 0 )
|
|||
|
{
|
|||
|
pRecv->lDataLen = ntohl(pRecv->lDataLen);
|
|||
|
if ( pRecv->lDataLen > 0 )
|
|||
|
{
|
|||
|
if ( pRecv->pRecvFrame )
|
|||
|
{
|
|||
|
delete pRecv->pRecvFrame;
|
|||
|
pRecv->pRecvFrame = NULL;
|
|||
|
}
|
|||
|
pRecv->pRecvFrame = new BYTE[pRecv->lDataLen];
|
|||
|
*((long*)pRecv->pRecvFrame) = pRecv->lDataLen; //<2F><><EFBFBD><EFBFBD>ǰ4<C7B0><34><EFBFBD>ֽ<EFBFBD>
|
|||
|
pRecv->lRecvLen = sizeof(pRecv->lDataLen);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
ULONG lBeRecv = pRecv->lDataLen-pRecv->lRecvLen;
|
|||
|
lRet = recv(s,(char*)pRecv->pRecvFrame+pRecv->lRecvLen , lBeRecv ,0);
|
|||
|
if ( lRet > 0 )
|
|||
|
pRecv->lRecvLen += lRet ;
|
|||
|
if ( pRecv->lRecvLen == pRecv->lDataLen ) //Frame <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
pRecv->lDataLen = 0; //<2F><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::RecvFrame(QQTX_Data_Recv &Drecv)
|
|||
|
{
|
|||
|
QQTX_Head * pHead=(QQTX_Head *)Drecv.pRecvFrame;
|
|||
|
if ( pHead->Total_Length != Drecv.lRecvLen )
|
|||
|
return false;
|
|||
|
|
|||
|
pHead->Command_Id = ntohl(pHead->Command_Id);
|
|||
|
pHead->Sequence_Id= ntohl(pHead->Sequence_Id);
|
|||
|
|
|||
|
BYTE * pData = (BYTE*)(Drecv.pRecvFrame+sizeof(QQTX_Head));
|
|||
|
long lLen = pHead->Total_Length-sizeof(QQTX_Head)-1;
|
|||
|
CStringA strAnsA((char*)pData,lLen);
|
|||
|
CString strAns = CA2W(strAnsA,CP_UTF8);
|
|||
|
|
|||
|
long lRet = 0;
|
|||
|
switch( pHead->Command_Id )
|
|||
|
{
|
|||
|
case QQ_CONNECT_RESP:
|
|||
|
lRet = Process_Connect(*pHead,strAns);
|
|||
|
break;
|
|||
|
case QQ_ACTIVE_TEST_RESP:
|
|||
|
lRet = Process_Active(*pHead,strAns);
|
|||
|
break;
|
|||
|
default:
|
|||
|
lRet = Process_Other(*pHead,strAns);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return lRet;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::QQTX_Init(const TCHAR *pIP,USHORT lPort, const TCHAR *pUser, const TCHAR *pPasswd,const TCHAR * pKey,int lConnectType)
|
|||
|
{
|
|||
|
//<2F><>¼<EFBFBD><C2BC>Ϣ
|
|||
|
strcpy(m_szQQTXIP,CW2A(pIP));
|
|||
|
_tcscpy(m_szQQTXUser,pUser);
|
|||
|
_tcscpy(m_szQQTXPasswd,pPasswd);
|
|||
|
_tcscpy(m_szQQTXKey,pKey);
|
|||
|
m_lConnectType = lConnectType;
|
|||
|
|
|||
|
if ( !Connect(m_szQQTXIP,lPort) )
|
|||
|
{
|
|||
|
return -1; //<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
}
|
|||
|
|
|||
|
CString strReq;
|
|||
|
CString strTemp=_T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")\
|
|||
|
_T("<Req>")\
|
|||
|
_T("<ConnectType>%d</ConnectType>")\
|
|||
|
_T("<UserName>%s</UserName>")\
|
|||
|
_T("<TimeStamp>%s</TimeStamp>")\
|
|||
|
_T("<Password>%s</Password>")\
|
|||
|
_T("</Req>");
|
|||
|
CString strTimeStamp;
|
|||
|
SYSTEMTIME t;GetLocalTime(&t);
|
|||
|
strTimeStamp.Format(_T("%04d%02d%02d%02d%02d%02d"),t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);
|
|||
|
CString strUserName = m_szQQTXUser;
|
|||
|
CString strPasswd = m_szQQTXPasswd;
|
|||
|
CString strKey = m_szQQTXKey;
|
|||
|
CString strMd5=CSendPub::GetMD5(strUserName+strKey+strTimeStamp+strPasswd);
|
|||
|
|
|||
|
strReq.Format(strTemp,m_lConnectType,strUserName,strTimeStamp,strMd5);
|
|||
|
|
|||
|
|
|||
|
m_bLoginQQTX = -1;
|
|||
|
ULONG lSeq=0;
|
|||
|
if ( !SendFrame(m_hSocket,m_lID,m_dwEndSendTime,QQ_CONNECT,strReq,lSeq) )
|
|||
|
{
|
|||
|
m_bQuitThread = true;
|
|||
|
return -2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
}
|
|||
|
|
|||
|
long lTime = ::GetTickCount();
|
|||
|
while ( m_bLoginQQTX == -1 )
|
|||
|
{
|
|||
|
if ( ::GetTickCount()-lTime > 30000 ) //<2F><>ʱ<EFBFBD><CAB1>
|
|||
|
break;
|
|||
|
Sleep_Lu(20);
|
|||
|
}
|
|||
|
if ( m_bLoginQQTX==0 )
|
|||
|
{
|
|||
|
m_bInitQQTX = true; //<2F>ѳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
return m_bLoginQQTX; //<2F><><EFBFBD>سɹ<D8B3>
|
|||
|
}
|
|||
|
if ( m_bLoginQQTX == -1 )
|
|||
|
{
|
|||
|
m_bQuitThread = true;
|
|||
|
return -3; //<2F><>¼<EFBFBD><C2BC>ʱ
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
m_bQuitThread = true;
|
|||
|
return m_bLoginQQTX; //<2F><>¼<EFBFBD><C2BC><EFBFBD>سɹ<D8B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿴<EFBFBD><EBBFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
m_bQuitThread = true;
|
|||
|
return -4; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::SendFrame(SOCKET sock,ULONG &lID,DWORD &dwEndSendTime,ULONG lCommandID,CString strReq,ULONG & lSeq )
|
|||
|
{
|
|||
|
EnterCriticalSection(&m_CriSendFrame); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
CStringA strReqA = CW2A(strReq,CP_UTF8);
|
|||
|
long lDataLen = strReqA.GetLength();
|
|||
|
|
|||
|
QQTX_Head head={0};
|
|||
|
long lAllLen;
|
|||
|
head.Total_Length = sizeof(head)+lDataLen+1; //<2F>ܳ<EFBFBD><DCB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD>etx
|
|||
|
lAllLen = head.Total_Length;
|
|||
|
head.Command_Id = lCommandID;
|
|||
|
if ( lID >= 0xF000000 ) //<2F><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
lID = 1;
|
|||
|
if ( lSeq > 0 )
|
|||
|
head.Sequence_Id = lSeq; //ֱ<><D6B1>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ŵķ<C5B5><C4B7><EFBFBD>
|
|||
|
else
|
|||
|
head.Sequence_Id = lID++;
|
|||
|
lSeq = head.Sequence_Id; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
head.stx = QQ_stx;
|
|||
|
head.Total_Length = htonl(head.Total_Length);
|
|||
|
head.Command_Id = htonl(head.Command_Id);
|
|||
|
head.Sequence_Id = htonl(head.Sequence_Id);
|
|||
|
|
|||
|
dwEndSendTime = ::GetTickCount(); //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
|||
|
BYTE * pSData = new BYTE[lAllLen];
|
|||
|
long lSetLen=0;
|
|||
|
memcpy(pSData,&head,sizeof(head));lSetLen+=sizeof(head);
|
|||
|
memcpy(pSData+lSetLen,strReqA.GetBuffer(),lDataLen);lSetLen+=lDataLen;
|
|||
|
pSData[lSetLen]=QQ_etx;lSetLen+=1;
|
|||
|
|
|||
|
BOOL bOK = Send(sock,(BYTE*)pSData , lAllLen );
|
|||
|
delete pSData;
|
|||
|
|
|||
|
long lRet = 0;
|
|||
|
if ( bOK )
|
|||
|
lRet = head.Sequence_Id;
|
|||
|
|
|||
|
LeaveCriticalSection(&m_CriSendFrame); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return lRet;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::Process_Connect(QQTX_Head head,CString strAns)
|
|||
|
{
|
|||
|
CMarkup xml(strAns);
|
|||
|
CString strRetCode;
|
|||
|
CString strErrMsg;
|
|||
|
if ( xml.FindElem(_T("/Ans/RetCode")) )
|
|||
|
strRetCode =xml.GetData();
|
|||
|
if ( xml.FindElem(_T("/Ans/ErrMsg")) )
|
|||
|
strErrMsg =xml.GetData();
|
|||
|
|
|||
|
BOOL bLoginRet = false;
|
|||
|
strRetCode.Trim();
|
|||
|
if ( strRetCode == CString(_T("0")) )
|
|||
|
{
|
|||
|
bLoginRet = true;
|
|||
|
}
|
|||
|
|
|||
|
if ( m_bInitQQTX && !bLoginRet ) //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>µ<EFBFBD>¼
|
|||
|
{
|
|||
|
//InitQQTX2();
|
|||
|
//<2F><>¼<EFBFBD><C2BC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
this->Close();
|
|||
|
}
|
|||
|
|
|||
|
CString str;
|
|||
|
str.Format(_T("QQTX<EFBFBD><EFBFBD>Ϣ:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7>ش<EFBFBD><D8B4><EFBFBD>:%s,%s") , strRetCode,strErrMsg );
|
|||
|
SetErrMsg(str);
|
|||
|
|
|||
|
m_bLoginQQTX = _ttol(strRetCode);
|
|||
|
if (!bLoginRet )
|
|||
|
m_bLoginQQTX = -100;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::InitQQTX2()
|
|||
|
{
|
|||
|
m_bLoginQQTX = -1;
|
|||
|
if ( !Connect2() )
|
|||
|
{
|
|||
|
return false; //<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
CString strReq;
|
|||
|
CString strTemp=_T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")\
|
|||
|
_T("<Req>")\
|
|||
|
_T("<ConnectType>%d</ConnectType>")\
|
|||
|
_T("<UserName>%s</UserName>")\
|
|||
|
_T("<TimeStamp>%s</TimeStamp>")\
|
|||
|
_T("<Password>%s</Password>")\
|
|||
|
_T("</Req>");
|
|||
|
CString strTimeStamp;
|
|||
|
SYSTEMTIME t;GetLocalTime(&t);
|
|||
|
strTimeStamp.Format(_T("%04d%02d%02d%02d%02d%02d"),t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);
|
|||
|
CString strUserName = m_szQQTXUser;
|
|||
|
CString strPasswd = m_szQQTXPasswd;
|
|||
|
CString strKey = m_szQQTXKey;
|
|||
|
CString strMd5=CSendPub::GetMD5(strUserName+strKey+strTimeStamp+strPasswd);
|
|||
|
|
|||
|
strReq.Format(strTemp,m_lConnectType,strUserName,strTimeStamp,strMd5);
|
|||
|
|
|||
|
|
|||
|
m_bLoginQQTX = -1;
|
|||
|
ULONG lSeq=0;
|
|||
|
if ( !SendFrame(m_hSocket,m_lID,m_dwEndSendTime,QQ_CONNECT,strReq,lSeq) )
|
|||
|
return -2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// memset(m_pSendList,0,sizeof(QQTX_Send_List)*SMS_MAX_LIST);
|
|||
|
/*
|
|||
|
for ( int i=0 ; i< SMS_MAX_LIST ;i++ )
|
|||
|
{
|
|||
|
if ( m_pSendList[i].lSendID > 0 )
|
|||
|
{
|
|||
|
m_pSendList[i].lReSendCount = 0;
|
|||
|
m_pSendList[i].lSendTime = 0;
|
|||
|
m_pSendList[i].lSeq = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
return -4; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::Process_Active(QQTX_Head head, CString strAns)
|
|||
|
{
|
|||
|
m_dwTestCount = 0; //<2F>յ<EFBFBD>activeָ<65><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::Process_Other(QQTX_Head head,CString strAns)
|
|||
|
{
|
|||
|
QQTX_Deliver_List Deliver;
|
|||
|
Deliver.lSendID = head.Sequence_Id;
|
|||
|
Deliver.head = head;
|
|||
|
Deliver.strAns = strAns;
|
|||
|
Deliver_Add(Deliver); //<2F><><EFBFBD>ӵ<EFBFBD><D3B5>б<EFBFBD>
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
|
|||
|
QQTX_Deliver_Resp resp={0};
|
|||
|
resp.Msg_ID = pDeliver->Msg_ID;
|
|||
|
resp.Result = 0;
|
|||
|
ULONG lReq=head.Sequence_Id;
|
|||
|
SendFrame(m_hSocket,m_lID,m_dwEndSendTime,QQTX_DELIVER_RESP,(BYTE*)&resp,lReq);
|
|||
|
*/
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::GetDeliver(QQTX_Deliver_List &deliver)
|
|||
|
{
|
|||
|
EnterCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
//<2F>ӵ<EFBFBD>ǰ<EFBFBD>㵽<EFBFBD><E3B5BD>β
|
|||
|
for ( int i=m_lDeliverList ; i< QQTX_MAX_DELIVER; i++ )
|
|||
|
{
|
|||
|
if ( m_pDeliverList[i].lSendID != 0 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0ʱ<30><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>Ϊ<EFBFBD><CEAA>
|
|||
|
{
|
|||
|
m_lDeliverList = i+1;
|
|||
|
deliver = m_pDeliverList[i];
|
|||
|
m_pDeliverList[i].lSendID = 0;
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F>ӿ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
|||
|
for ( i=0 ; i<m_lDeliverList; i++ )
|
|||
|
{
|
|||
|
if ( m_pDeliverList[i].lSendID != 0 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0ʱ<30><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>Ϊ<EFBFBD><CEAA>
|
|||
|
{
|
|||
|
m_lDeliverList = i+1;
|
|||
|
deliver = m_pDeliverList[i];
|
|||
|
m_pDeliverList[i].lSendID = 0;
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
m_lDeliverList = 0;
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::QQTX_Exit()
|
|||
|
{
|
|||
|
m_bInitQQTX = false; //<2F>ѳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
//ULONG lSeq=0;
|
|||
|
//SendFrame(m_hSocket,m_lID,m_dwEndSendTime,QQTX_TERMINATE,_T(""),lSeq);
|
|||
|
Stop(); //ֹͣ
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::Deliver_Add(QQTX_Deliver_List Deliver)
|
|||
|
{
|
|||
|
EnterCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
//<2F>ӵ<EFBFBD>ǰ<EFBFBD>㵽<EFBFBD><E3B5BD>β
|
|||
|
for ( int i=m_lDeliverList ; i< QQTX_MAX_DELIVER; i++ )
|
|||
|
{
|
|||
|
if ( m_pDeliverList[i].lSendID == 0 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0ʱ<30><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>Ϊ<EFBFBD><CEAA>
|
|||
|
{
|
|||
|
m_pDeliverList[i] = Deliver;
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F>ӿ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
|||
|
for ( i=0 ; i<m_lDeliverList; i++ )
|
|||
|
{
|
|||
|
if ( m_pDeliverList[i].lSendID == 0 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0ʱ<30><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>Ϊ<EFBFBD><CEAA>
|
|||
|
{
|
|||
|
m_pDeliverList[i] = Deliver;
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
LeaveCriticalSection(&m_CriDeliverList); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
void CQQTX::SetSendSpeed(long lSpeed)
|
|||
|
{
|
|||
|
if ( lSpeed<=0 )
|
|||
|
m_lSendInterval = 0;
|
|||
|
else
|
|||
|
m_lSendInterval = 1000/lSpeed;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::GetWFSms()
|
|||
|
{
|
|||
|
long lWF=0;
|
|||
|
return lWF;
|
|||
|
}
|
|||
|
|
|||
|
long CQQTX::GetReportSms()
|
|||
|
{
|
|||
|
long lReport=0;
|
|||
|
return lReport;
|
|||
|
}
|
|||
|
|
|||
|
CString CQQTX::GetErrMsg()
|
|||
|
{
|
|||
|
EnterCriticalSection(&m_CriErrMsg); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
|
|||
|
CString strRet;
|
|||
|
if ( m_strErrMsg.GetLength()>0 )
|
|||
|
{
|
|||
|
strRet = m_strErrMsg;
|
|||
|
m_strErrMsg = CString(_T(""));
|
|||
|
}
|
|||
|
LeaveCriticalSection(&m_CriErrMsg); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
return strRet;
|
|||
|
}
|
|||
|
|
|||
|
void CQQTX::SetErrMsg(CString str)
|
|||
|
{
|
|||
|
EnterCriticalSection(&m_CriErrMsg); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
|
|||
|
m_strErrMsg = str;
|
|||
|
|
|||
|
LeaveCriticalSection(&m_CriErrMsg); //<2F><>ֹ<EFBFBD><D6B9>ͻ
|
|||
|
}
|
|||
|
|
|||
|
BOOL CQQTX::isConnectGateWay()
|
|||
|
{
|
|||
|
if ( m_bLoginQQTX == 0 )
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|