SmsManager/processsocket.cpp

923 lines
22 KiB
C++
Raw Normal View History

2025-01-14 10:46:18 +08:00
// processsocket.cpp : implementation file
//
#include "stdafx.h"
#include "SmsManager.h"
#include "processsocket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CProcessSocket
#include "..\public\pop3\pop3.h"
#ifdef _M_X64
#include "..\public\lzo_64\Lzo.cpp"
#else
#include "..\public\lzo\Lzo.cpp"
#endif
#define ZLIB_WINAPI
#include "..\public\zlib\zlib.h"
#ifdef _M_X64
#pragma comment(lib,"..\\public\\zlib\\Lib64\\zlibwapi.lib")
#else
#pragma comment(lib,"..\\public\\zlib\\Lib\\zlibwapi.lib")
#endif
CProcessSocket::CProcessSocket()
{
m_pWnd = NULL;
m_bSend = false;
m_bConnect = false;
m_lID = 0; //<2F><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ID,<2C><>0<EFBFBD><30>ʼ
memset(&m_RecvHead,0,sizeof(m_RecvHead)); //<2F><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>Head
m_lRecvHead = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Head<61>ֽ<EFBFBD><D6BD><EFBFBD>
m_lRecvFrame= 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Frame<6D>ֽ<EFBFBD><D6BD><EFBFBD>
m_bRecvFrame= false; //<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Frame;
m_pRecvFrame= NULL;
memset(&m_Setup,0,sizeof(m_Setup));
m_lUserID = 0;
m_ucUserType = LOGINTYPE_MANAGER;
m_ulVer = MAKELPARAM(0xAFFF,CORPSMS_VERM);
//<2F><>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
m_hInternet = NULL;
m_hConnection = NULL;
m_lCompress = SENDDATA_COMPRESS;
m_hHttp = INVALID_HANDLE_VALUE;
}
CProcessSocket::~CProcessSocket()
{
Close();
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CProcessSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CProcessSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CProcessSocket member functions
void CProcessSocket::OnConnect(int nErrorCode)
{
CAsyncProxySocket::OnConnect(nErrorCode);
if (nErrorCode)
{
m_bSend = false;
this->Close();
NotifyMainWnd( PROCESSSOCKET_ERROR , PROCESSSOCKET_ERROR_CONNECT , 0 );
}
else
{
m_bSend = true;
}
}
void CProcessSocket::OnSend(int nErrorCode)
{
CAsyncProxySocket::OnSend(nErrorCode);
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
while (!m_Frame.IsEmpty())
{
Socket_Head * pHead = m_Frame.GetHead();
ULONG lSendFrameLen = pHead->lFrameLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵ij<CDB5><C4B3><EFBFBD>
BOOL bOK = true;
m_Frame.RemoveHead();
if ( pHead->bCompress >0 )
{
bOK = false;
ULONG lCount = pHead->lFrameLen + 2048;
BYTE * pFrame = new BYTE[lCount];memset(pFrame , 0 , lCount);
if ( pHead->bCompress == 1 )
{
if ( lzo.Compress( pHead->pFrame , pHead->lFrameLen , pFrame , &lCount )>0 && lCount > 0 )
{
bOK = true;
}
}
if ( pHead->bCompress == 2 )
{
if ( compress( pFrame , &lCount , pHead->pFrame , pHead->lFrameLen )==Z_OK && lCount > 0 )
{
bOK = true;
}
}
if ( bOK )
{
delete pHead->pFrame; //ѹ<><D1B9><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>滻Ҫ<E6BBBB><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
pHead->pFrame = pFrame;
pHead->lCompressLen = lCount;
lSendFrameLen = lCount; //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
}
else
{
delete pFrame;
}
}
if ( bOK )
{
Send( pHead , sizeof(Socket_Head) );
if ( lSendFrameLen>0 )
Send( pHead->pFrame , lSendFrameLen );
}
delete pHead->pFrame;
delete pHead;
}
}
void CProcessSocket::OnClose(int nErrorCode)
{
CAsyncProxySocket::OnClose(nErrorCode);
Close();
// AfxMessageBox( "close" );
}
void CProcessSocket::OnReceive(int nErrorCode)
{
CAsyncProxySocket::OnReceive(nErrorCode);
for(;;)
{
long lRet;
if (m_bRecvFrame)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
ULONG lBeRecv = m_RecvHead.lFrameLen;
if ( m_RecvHead.bCompress>0 )
lBeRecv=m_RecvHead.lCompressLen;
lRet = Receive( m_pRecvFrame+m_lRecvFrame , lBeRecv-m_lRecvFrame );
if ( lRet > 0 )
m_lRecvFrame += lRet ;
if ( lBeRecv == m_lRecvFrame ) //Frame <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
BYTE * pFrame = m_pRecvFrame;
BOOL bOK = true;
if ( m_RecvHead.lFuncType != SMSFUNC_TEST )
SetCompressType(m_RecvHead.bCompress); //ȡ<><C8A1><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѡ<EFBFBD><D1A1>
if ( m_RecvHead.bCompress>0 ) //<2F><>ѹ
{
ULONG lCount = m_RecvHead.lFrameLen+2048;
pFrame = new BYTE[lCount];memset( pFrame , 0 , lCount );
if ( m_RecvHead.bCompress == 1 )
{
if ( !lzo.decompress( m_pRecvFrame , m_lRecvFrame , pFrame , &lCount ))
{
bOK = false; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>,<2C><><EFBFBD><EFBFBD>֪ͨ<CDA8>յ<EFBFBD>֡
//<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>
delete pFrame;
}
}
if ( m_RecvHead.bCompress == 2 )
{
if ( uncompress( pFrame , &lCount , m_pRecvFrame , m_lRecvFrame)!=Z_OK)
{
bOK = false; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>,<2C><><EFBFBD><EFBFBD>֪ͨ<CDA8>յ<EFBFBD>֡
//<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>
delete pFrame;
}
}
delete m_pRecvFrame; //<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ΪpFrame,<2C><><EFBFBD><EFBFBD>Ҫɾ<D2AA><C9BE>m_pRecvFrame;
m_pRecvFrame = NULL;
}
else
{
m_pRecvFrame = NULL; //<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>PROCESSSOCKET_FRAME<4D><45>delete,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<4C><4C><EFBFBD><EFBFBD>
}
if ( bOK )
{
Socket_Head * pHead = new Socket_Head;
*pHead = m_RecvHead;
pHead->pFrame = pFrame;
NotifyMainWnd( PROCESSSOCKET_FRAME , (WPARAM)pHead , 0 );
}
m_bRecvFrame = false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ͷ
m_lRecvHead = 0;
}
}
else
{
lRet = Receive( ((BYTE*)&m_RecvHead)+m_lRecvHead,sizeof(m_RecvHead)-m_lRecvHead );
if ( lRet > 0 )
m_lRecvHead += lRet;
if ( m_lRecvHead == sizeof(m_RecvHead) ) //ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if ( m_pRecvFrame )
delete m_pRecvFrame;
if ( m_RecvHead.bCompress>0 )
m_pRecvFrame = new BYTE[m_RecvHead.lCompressLen];
else
m_pRecvFrame = new BYTE[m_RecvHead.lFrameLen];
m_bRecvFrame = true; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Frame<6D><65>
m_lRecvFrame = 0; //<2F>յ<EFBFBD><D5B5><EFBFBD>Frame <20>ֽ<EFBFBD><D6BD><EFBFBD>Ϊ0
}
}
if (lRet==SOCKET_ERROR || !lRet)
{
break;
}
}
}
void CProcessSocket::OnProxyOperationFailed(int nOpID)
{
NotifyMainWnd( PROCESSSOCKET_ERROR , PROCESSSOCKET_ERROR_PROXY , 0 );
}
void CProcessSocket::OnListenFinished(unsigned long &retProxyIp,int &retProxyPort)
{
}
void CProcessSocket::SetParent(CWnd *pWnd)
{
m_pWnd = pWnd;
}
BOOL CProcessSocket::ConnectToServer(SM_Setup setup,BOOL bReConnect)
{
//<2F>ж<EFBFBD>Socketԭ<74><D4AD><EFBFBD><EFBFBD>û<EFBFBD>д򿪣<D0B4><F2BFAAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ( m_bConnect )
{
if ( bReConnect )
{
Close();
}
else
{
return true;
}
}
//<2F><><EFBFBD><EFBFBD>ʲô<CAB2><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵
this->Close();
m_Setup = setup; //ȡ<>ò<EFBFBD><C3B2><EFBFBD>
if ( m_Setup.bGateWay ) //ʹ<>ó<EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
{
/*
HTTP:
HTTP=HTTP://proxyserver:port
FTP:
FTP:FTP://proxyserver:port
GOPHER
GOPHER=HTTP://proxyserver:port
SOCKS=proxyserver:port
*/
CString strTemp;
CString strProxy;
strTemp.Format(_T("%s-%d"),AfxGetAppName(),GetTickCount());
if ( setup.bProxyUse ) //ʹ<>ô<EFBFBD><C3B4><EFBFBD>
{
switch(setup.lProxyType)
{
case 0: //SOCKS 4
case 1: //SOCKS 4A
case 2: //SOCKS 5
strProxy.Format( _T("SOCKS=%s:%d") , setup.szProxyIP , setup.lProxyPort );
break;
case 3: //http
//strProxy.Format( _T("HTTP://%s:%d") , setup.szProxyIP , setup.lProxyPort );
strProxy.Format( _T("%s:%d") , setup.szProxyIP , setup.lProxyPort );
break;
}
m_hInternet = InternetOpen(strTemp,INTERNET_OPEN_TYPE_PROXY ,strProxy,NULL,0);
}
else
{
m_hInternet = InternetOpen(strTemp,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
}
if ( !m_hInternet )
return false;
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ( setup.bProxyUse ) //ʹ<>ô<EFBFBD><C3B4><EFBFBD>
{
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = strProxy;
proxyinfo.lpszProxyBypass = NULL;
InternetSetOption(m_hInternet,INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
if ( _tcslen(setup.szProxyUser)>0 )
{
InternetSetOption(m_hInternet,
INTERNET_OPTION_PROXY_USERNAME,
setup.szProxyUser,
_tcslen(setup.szProxyUser)+1);
}
if ( _tcslen(setup.szProxyPasswd)>0 )
{
InternetSetOption(m_hInternet,
INTERNET_OPTION_PROXY_PASSWORD,
setup.szProxyPasswd,
_tcslen(setup.szProxyPasswd)+1);
}
}
m_hConnection= InternetConnect(m_hInternet,m_Setup.szIP,INTERNET_DEFAULT_HTTP_PORT,_T(""),_T(""),INTERNET_SERVICE_HTTP,0,NULL);
if ( !m_hConnection )
return false;
m_bConnect = true;
m_bSend = true;
DWORD dwTemp;
m_hHttp=CreateThread(NULL,0,Http_Socket,(LPVOID)this,0,&dwTemp);
if ( m_hHttp==INVALID_HANDLE_VALUE )
{
Close();
return false;
}
SetThreadPriority(m_hHttp,THREAD_PRIORITY_LOWEST); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
return true;
}
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
if ( !setup.bProxyUse )
{
this->SetProxy(PROXYTYPE_NOPROXY);
}
else
{
if ( setup.lProxyType == 0 || //Sock 4
setup.lProxyType == 1 ) //Sock 4a //<2F><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
#ifdef UNICODE
SetProxy(setup.lProxyType+1,CW2A(setup.szProxyIP),setup.lProxyPort);
#else
SetProxy(setup.lProxyType+1,setup.szProxyIP,setup.lProxyPort);
#endif
}
else
{
if ( _tcslen(setup.szProxyUser) > 0 )
{
#ifdef UNICODE
SetProxy(setup.lProxyType+1,CW2A(setup.szProxyIP),setup.lProxyPort,CW2A(setup.szProxyUser),CW2A(setup.szProxyPasswd));
#else
SetProxy(setup.lProxyType+1,setup.szProxyIP,setup.lProxyPort,setup.szProxyUser,setup.szProxyPasswd);
#endif
}
else
{
#ifdef UNICODE
SetProxy(setup.lProxyType+1,CW2A(setup.szProxyIP),setup.lProxyPort);
#else
SetProxy(setup.lProxyType+1,setup.szProxyIP,setup.lProxyPort);
#endif
}
}
}
//<2F><><EFBFBD><EFBFBD>
this->Create();
//<2F><><EFBFBD><EFBFBD>
BOOL res;
srand(GetTickCount());
//<2F>ֽ<EFBFBD>IP<49><50><EFBFBD>˿<EFBFBD>
#ifdef UNICODE
long lPort = DEFAULT_SERVERPORT_UNI;
#else
long lPort = DEFAULT_SERVERPORT;
#endif
CString strIP = setup.szIP;
CString strTemp = setup.szIP;
long lBegin = strIP.Find(_T(":"));
if ( lBegin>0 )
{
strIP = strTemp.Left(lBegin);
CString strPort = strTemp.Right(strTemp.GetLength()-lBegin-1);
if ( _ttol(strPort)>0 )
lPort = _ttol(strPort);
}
#ifdef _UNICODE
res=this->Connect(CW2A(strIP),lPort);
#else
res=this->Connect(strIP,lPort);
#endif
/*
if (!res)
{
if (GetLastError()!=WSAEWOULDBLOCK)
{
if (setup.bProxyUse)
AfxMessageBox("Error! Can't connect to proxy server!",MB_ICONEXCLAMATION);
else
AfxMessageBox("Error! Can't connect to server!",MB_ICONEXCLAMATION);
return false;
}
return true;
}
*/
if ( GetLastError() == 1035 || GetLastError() !=0 )
{
m_bConnect = true;
return true;
}
/*
//<2F><><EFBFBD>ӵڶ<D3B5><DAB6><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>˿<EFBFBD>
res=this->Connect("211.154.104.141",80);
if ( GetLastError() == 1035 || GetLastError() !=0 )
{
m_bConnect = true;
return true;
}
*/
m_bConnect = false;
return false;
}
void CProcessSocket::Close()
{
if (m_hSocket != INVALID_SOCKET)
{
CAsyncProxySocket::Close();
}
//<2F>رճ<D8B1>͸<EFBFBD><CDB8><EFBFBD>صľ<D8B5><C4BE><EFBFBD>
if ( m_hConnection != NULL )
{
InternetCloseHandle(m_hConnection);
}
if ( m_hInternet != NULL )
{
InternetCloseHandle(m_hInternet);
}
m_bConnect = false;
m_bSend = false;
if ( m_hHttp != INVALID_HANDLE_VALUE )
{
if (WaitForSingleObject(m_hHttp,3000)== WAIT_TIMEOUT )
TerminateThread(m_hHttp,0); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD><CAB1>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>߳<EFBFBD>
CloseHandle(m_hHttp);
m_hHttp = INVALID_HANDLE_VALUE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
while (!m_Frame.IsEmpty())
{
Socket_Head * pHead = m_Frame.GetHead();
m_Frame.RemoveHead();
delete pHead->pFrame;
delete pHead;
}
try
{
if ( m_pRecvFrame )
{
delete m_pRecvFrame;
}
}
catch(...)
{
}
m_lRecvHead = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Head<61>ֽ<EFBFBD><D6BD><EFBFBD>
m_lRecvFrame= 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Frame<6D>ֽ<EFBFBD><D6BD><EFBFBD>
m_bRecvFrame= false; //<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Frame;
m_pRecvFrame= NULL;
}
BOOL CProcessSocket::SendFrame(unsigned char lFuncType, unsigned char *pFrame, unsigned long lFrameLen)
{
if ( !ConnectToServer(m_Setup) ) //<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ӣ<EFBFBD><D3A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
delete pFrame;
return false;
}
Socket_Head * pHead = new Socket_Head;
memset( pHead , 0 , sizeof(Socket_Head) );
pHead->lFuncType = lFuncType; //<2F><><EFBFBD>ܺ<EFBFBD>
pHead->bCompress = m_lCompress; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
//pHead->bCompress = false; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
//pHead->lID = m_lID ++;
pHead->lID = m_ulVer;
pHead->lUserID = m_lUserID;
pHead->lUserType = m_ucUserType;
pHead->lFrameLen = lFrameLen;
pHead->pFrame = pFrame;
m_Frame.AddTail( pHead );
if ( !m_Setup.bGateWay && m_bSend ) //<2F><>ʹ<EFBFBD>ó<EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
AsyncSelect(FD_WRITE|FD_READ|FD_CLOSE); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>д<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//AsyncSelect(FD_READ | FD_CLOSE);
}
return true;
}
BOOL CProcessSocket::SendFrameEx(DWORD lFuncType, unsigned char *pFrame, unsigned long lFrameLen)
{
if ( !ConnectToServer(m_Setup) ) //<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ӣ<EFBFBD><D3A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
delete pFrame;
return false;
}
#ifdef _UNICODE
Socket_Head * pHead = new Socket_Head;
memset( pHead , 0 , sizeof(Socket_Head) );
pHead->lFuncType = lFuncType; //<2F><><EFBFBD>ܺ<EFBFBD>
pHead->bCompress = m_lCompress; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
//pHead->bCompress = false; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
//pHead->lID = m_lID ++;
pHead->lID = m_ulVer;
pHead->lUserID = m_lUserID;
pHead->lUserType = m_ucUserType;
pHead->lFrameLen = lFrameLen;
pHead->pFrame = pFrame;
m_Frame.AddTail( pHead );
#else
long lFrameLen2 = lFrameLen + sizeof(Socket_Head_Add);
BYTE * pData = new BYTE[lFrameLen2];
Socket_Head_Add * pAdd = (Socket_Head_Add *)pData; //<2F><><EFBFBD><EFBFBD>ͷ
BYTE * pFrame2 = pData + sizeof(Socket_Head_Add); //ԭ<><D4AD><EFBFBD><EFBFBD>
memset(pAdd , 0 , sizeof(Socket_Head_Add) );
pAdd->lFuncType = lFuncType;
pAdd->lFrameLen = lFrameLen;
memcpy(pFrame2 , pFrame , lFrameLen);
delete pFrame;
Socket_Head * pHead = new Socket_Head;
memset( pHead , 0 , sizeof(Socket_Head) );
pHead->lFuncType = SMSFUNC_EX; //<2F><><EFBFBD>ܺ<EFBFBD>
//pHead->bCompress = SENDDATA_COMPRESS; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
pHead->bCompress = false; //<2F>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
//pHead->lID = m_lID ++;
pHead->lID = m_ulVer;
pHead->lUserID = m_lUserID;
pHead->lUserType = m_ucUserType;
pHead->lFrameLen = lFrameLen2;
pHead->pFrame = pData;
m_Frame.AddTail( pHead );
#endif
if ( !m_Setup.bGateWay && m_bSend ) //<2F><>ʹ<EFBFBD>ó<EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
AsyncSelect(FD_WRITE|FD_READ|FD_CLOSE); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>д<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//AsyncSelect(FD_READ | FD_CLOSE);
}
return true;
}
void CProcessSocket::NotifyMainWnd(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
if ( m_pWnd )
{
m_pWnd->PostMessage( nMsg , wParam , lParam );
//m_pWnd->SendMessage( nMsg , wParam , lParam );
}
}
void CProcessSocket::SetCompressType(int lCompressType)
{
m_lCompress = lCompressType;
if ( m_lCompress<0 || m_lCompress>2 )
m_lCompress=0;
}
void CProcessSocket::SetUserID(long lUserID)
{
m_lUserID = lUserID;
}
int CProcessSocket::Send(const void* lpBuf, int nBufLen, int nFlags)
{
#define SOCKET_SEND_TIMEOUT 10000 //10<31><EFBFBD>ͳ<EFBFBD>ʱ
if ( nBufLen<=0 )
return 0;
long lSended = 0;
DWORD lTimeOut = ::GetTickCount();
while ( 1 )
{
long lRet = CAsyncSocket::Send(((UCHAR*)lpBuf+lSended), nBufLen-lSended, nFlags);
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 >= nBufLen )
break;
}
else
{
Sleep( 50 ); //緳<><E7B7B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>
}
if ( ::GetTickCount() - lTimeOut > SOCKET_SEND_TIMEOUT )
break;
}
return lSended;
}
DWORD WINAPI CProcessSocket::Http_Socket(LPVOID lParam)
{
#define REQHEAD "MOBSETGATEWAY002"
CProcessSocket * pPro = (CProcessSocket *)lParam;
try
{
while ( pPro->m_bConnect && pPro->m_bSend )
{
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
while (!pPro->m_Frame.IsEmpty())
{
Socket_Head * pHead = pPro->m_Frame.GetHead();
ULONG lSendFrameLen = pHead->lFrameLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵ij<CDB5><C4B3><EFBFBD>
BOOL bOK = true;
pPro->m_Frame.RemoveHead();
if ( pHead->bCompress>0 )
{
bOK = false;
ULONG lCount = pHead->lFrameLen + 2048;
BYTE * pFrame = new BYTE[lCount];memset(pFrame , 0 , lCount);
if ( pHead->bCompress==1 )
{
if ( pPro->lzo.Compress( pHead->pFrame , pHead->lFrameLen , pFrame , &lCount )>0 && lCount > 0 )
{
bOK = true;
}
}
if ( pHead->bCompress==2 )
{
if ( compress( pFrame , &lCount,pHead->pFrame , pHead->lFrameLen )==Z_OK && lCount > 0 )
{
bOK = true;
}
}
if ( bOK )
{
delete pHead->pFrame; //ѹ<><D1B9><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>滻Ҫ<E6BBBB><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
pHead->pFrame = pFrame;
pHead->lCompressLen = lCount;
lSendFrameLen = lCount; //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
}
else
{
delete pFrame;
}
}
if ( bOK )
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
long lSendBytes = (sizeof(Socket_Head)+lSendFrameLen)*2;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
char szBegin[256]={0};strcpy(szBegin,"SMS=");strcat(szBegin,REQHEAD);
char szBegin2[256]={0};sprintf(szBegin2,"%010d",lSendBytes);
strcat(szBegin,szBegin2); //ͷ+<2B><><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD>
char szEnd[256]={0};strcpy(szEnd,"&Submit=%CC%E1%BD%BB");
lSendBytes=lSendBytes+strlen(szBegin)+strlen(szEnd);
char * pSend = new char[lSendBytes+10];
memset(pSend ,0,lSendBytes+10);
//<2F><><EFBFBD><EFBFBD>ͷ
strcpy(pSend,szBegin);
char * pSend2 = pSend + strlen(szBegin);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AsciiToHex((char*)pHead ,pSend2,sizeof(Socket_Head));pSend2=pSend2+sizeof(Socket_Head)*2;
AsciiToHex((char*)pHead->pFrame,pSend2,lSendFrameLen);pSend2=pSend2+lSendFrameLen*2;
//<2F><><EFBFBD><EFBFBD>β
strcpy(pSend2,szEnd);
char szAcceptType[32]={0};
strcpy(szAcceptType,"*/*");
HINTERNET hHttpFile = HttpOpenRequest(pPro->m_hConnection,
_T("POST"),
SUPPERGATEWAY_POST,
HTTP_VERSION,
NULL,
NULL,
INTERNET_FLAG_RELOAD,
0);
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ( pPro->m_Setup.bProxyUse ) //ʹ<>ô<EFBFBD><C3B4><EFBFBD>
{
/*
CString strProxy;
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = strProxy;
proxyinfo.lpszProxyBypass = NULL;
InternetSetOption(m_hInternet,INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
*/
if ( _tcslen(pPro->m_Setup.szProxyUser)>0 )
{
InternetSetOption(hHttpFile,
INTERNET_OPTION_PROXY_USERNAME,
pPro->m_Setup.szProxyUser,
_tcslen(pPro->m_Setup.szProxyUser)+1);
}
if ( _tcslen(pPro->m_Setup.szProxyPasswd)>0 )
{
InternetSetOption(hHttpFile,
INTERNET_OPTION_PROXY_PASSWORD,
pPro->m_Setup.szProxyPasswd,
_tcslen(pPro->m_Setup.szProxyPasswd)+1);
}
}
//TRACE(pSend);
// Send the request.
CString Head=_T("Content-Type: application/x-www-form-urlencoded");
BOOL bSendRequest = ::HttpSendRequest(hHttpFile, Head,Head.GetLength(), pSend, lSendBytes);
// Get the length of the file.
char bufQuery[32] ;
DWORD dwIndex=0;
DWORD dwLengthBufQuery = sizeof(bufQuery);
BOOL bQuery = HttpQueryInfo(hHttpFile,
HTTP_QUERY_CONTENT_LENGTH,
bufQuery,
&dwLengthBufQuery,
&dwIndex);
// Convert length from ASCII string to a DWORD.
DWORD dwFileSize = (DWORD)atol(bufQuery) ;
if ( dwFileSize >0 )
{
// Allocate a buffer for the file.
char* pRecv = new char[dwFileSize+10] ;
// Read the file into the buffer.
DWORD dwBytesRead ;
BOOL bRead = ::InternetReadFile(hHttpFile,
pRecv,
dwFileSize+1,
&dwBytesRead);
// Put a zero on the end of the buffer.
pRecv[dwBytesRead] = 0 ;
/*
CFile file(_T("e:\\abc.htm") , CFile::modeCreate|CFile::modeReadWrite);
file.Write(pRecv , dwBytesRead);
file.Close();
*/
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (!strncmp(pRecv,REQHEAD,strlen(REQHEAD)) ) //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>Ϣ
{
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dwBytesRead = dwBytesRead-strlen(REQHEAD);
BYTE * pData = new BYTE[dwBytesRead];
memset(pData,0,dwBytesRead);
HexToAscii((char*)(pRecv+strlen(REQHEAD)),(char*)pData);
long lDataLen = dwBytesRead/2;
for ( int i=0 ; i<lDataLen ; i++ )
{
Socket_Head SHead={0};
memcpy(&SHead,pData+i,sizeof(Socket_Head)); i=i+sizeof(Socket_Head);
long lGetLen=SHead.lFrameLen;
if ( SHead.bCompress>0 )
lGetLen = SHead.lCompressLen;
if ( i+lGetLen>lDataLen) //<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
{
break;
}
BYTE * pFrame = NULL;
BOOL bOK = true;
if ( SHead.lFuncType != SMSFUNC_TEST )
pPro->SetCompressType(SHead.bCompress); //ȡ<><C8A1><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѡ<EFBFBD><D1A1>
if ( SHead.bCompress>0 ) //<2F><>ѹ
{
ULONG lCount = SHead.lFrameLen+2048;
pFrame = new BYTE[lCount];memset( pFrame , 0 , lCount );
if ( SHead.bCompress == 1 )
{
if ( !pPro->lzo.decompress( pData+i , lGetLen , pFrame , &lCount ))
{
bOK = false; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>,<2C><><EFBFBD><EFBFBD>֪ͨ<CDA8>յ<EFBFBD>֡
//<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>
delete pFrame;
}
}
if ( SHead.bCompress == 2 )
{
if ( uncompress( pFrame , &lCount , pData+i , lGetLen )!=Z_OK)
{
bOK = false; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>,<2C><><EFBFBD><EFBFBD>֪ͨ<CDA8>յ<EFBFBD>֡
//<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ɹ<EFBFBD>
delete pFrame;
}
}
}
else
{
ULONG lCount = lGetLen+512;
pFrame = new BYTE[lCount];memset( pFrame , 0 , lCount );
memcpy(pFrame,pData+i,lGetLen);
}
if ( bOK )
{
Socket_Head * pHead = new Socket_Head;
*pHead = SHead;
pHead->pFrame = pFrame;
pPro->NotifyMainWnd( PROCESSSOCKET_FRAME , (WPARAM)pHead , 0 );
}
i=i+lGetLen;
i=i-1;
}
delete pData;
}
delete pRecv;
}
delete pSend;
InternetCloseHandle(hHttpFile);
}
delete pHead->pFrame;
delete pHead;
}
Sleep(100); //<2F><><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>Ϣһ<CFA2>¡<EFBFBD>
}
}
catch(...)
{
//<2F><><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
DWORD dwTemp;
pPro->m_hHttp = CreateThread(NULL,0,Http_Socket,(LPVOID)pPro,0,&dwTemp);
if ( pPro->m_hHttp != INVALID_HANDLE_VALUE )
{
SetThreadPriority(pPro->m_hHttp,THREAD_PRIORITY_LOWEST); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
}
return -1;
}
return 0;
}
void CProcessSocket::AsciiToHex(char *pszOrgRandom, char *pszDesRandom, long lLen)
{
char *p = (char *)pszDesRandom;
//long lLen = lstrlen( (char*)pszOrgRandom);
for( long i = 0; i < lLen; ++i )
{
sprintf(p, "%02X", (BYTE)pszOrgRandom[i] );
p += 2;
}
*p=0;
}
void CProcessSocket::HexToAscii(char *pszOrgRandom, char *pszDesRandom)
{
char Buf[4];
char *pDes = (char *)pszDesRandom;
char *pOrg = (char *)pszOrgRandom;
long lLen = strlen( pOrg);
long lTemp;
for( int i = 0; i < lLen/2; ++i )
{
memcpy( Buf , pOrg+i*2 , 2 );
Buf[2] = 0;
lTemp = CharHex(Buf[0])*16 + CharHex(Buf[1]);
pDes[i] = (char)lTemp;
}
pDes[i] = 0;
}
int CProcessSocket::CharHex(TCHAR ch)
{
//if( isdigit( ch ) ) return( atoi( &ch) );
if( ch >='0' && ch <= '9' ) return( _ttoi( &ch) );
else {
if( ch == 'a' || ch == 'A' ) return( 10 );
if( ch == 'b' || ch == 'B' ) return( 11 );
if( ch == 'c' || ch == 'C' ) return( 12 );
if( ch == 'd' || ch == 'D' ) return( 13 );
if( ch == 'e' || ch == 'E' ) return( 14 );
if( ch == 'f' || ch == 'F' ) return( 15 );
}
return( 0 );
}
void CProcessSocket::SetUserType(unsigned char ucUserType)
{
m_ucUserType = ucUserType;
}
void CProcessSocket::SetVer(unsigned long ulVer)
{
m_ulVer = ulVer;
}