// 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; //发送帧的ID,由0开始 memset(&m_RecvHead,0,sizeof(m_RecvHead)); //用于接收Head m_lRecvHead = 0; //已收到的Head字节数 m_lRecvFrame= 0; //已收到的Frame字节数 m_bRecvFrame= false; //开始时不是在收Frame; m_pRecvFrame= NULL; memset(&m_Setup,0,sizeof(m_Setup)); m_lUserID = 0; m_ucUserType = LOGINTYPE_MANAGER; m_ulVer = MAKELPARAM(0xAFFF,CORPSMS_VERM); //超透网关用到 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); //发送队列中的内容 while (!m_Frame.IsEmpty()) { Socket_Head * pHead = m_Frame.GetHead(); ULONG lSendFrameLen = pHead->lFrameLen; //最终需要发送的长度 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; //压缩成功,替换要发送的内容 pHead->pFrame = pFrame; pHead->lCompressLen = lCount; lSendFrameLen = lCount; //最终要发送的字节数 } 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) { //计算需要接收的总字节数 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 已收满 { BYTE * pFrame = m_pRecvFrame; BOOL bOK = true; if ( m_RecvHead.lFuncType != SMSFUNC_TEST ) SetCompressType(m_RecvHead.bCompress); //取来自服务器的压缩选项 if ( m_RecvHead.bCompress>0 ) //解压 { 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; //解压不成功,不用通知收到帧 //解压不成功 delete pFrame; } } if ( m_RecvHead.bCompress == 2 ) { if ( uncompress( pFrame , &lCount , m_pRecvFrame , m_lRecvFrame)!=Z_OK) { bOK = false; //解压不成功,不用通知收到帧 //解压不成功 delete pFrame; } } delete m_pRecvFrame; //因为数据已转换为pFrame,所以要删除m_pRecvFrame; m_pRecvFrame = NULL; } else { m_pRecvFrame = NULL; //因为处理PROCESSSOCKET_FRAME会delete,所以现在只需置其等于NULL即可 } if ( bOK ) { Socket_Head * pHead = new Socket_Head; *pHead = m_RecvHead; pHead->pFrame = pFrame; NotifyMainWnd( PROCESSSOCKET_FRAME , (WPARAM)pHead , 0 ); } m_bRecvFrame = false; //又再需要接收头 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) ) //头已收满 { 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; //下一次需要收Frame了 m_lRecvFrame = 0; //收到的Frame 字节数为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) { //判断Socket原先有没有打开,如果打开 if ( m_bConnect ) { if ( bReConnect ) { Close(); } else { return true; } } //不管什么情况,关掉连接再说 this->Close(); m_Setup = setup; //取得参数 if ( m_Setup.bGateWay ) //使用超透网关 { /* 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 ) //使用代理 { 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; //设置代理用户名及密码 if ( setup.bProxyUse ) //使用代理 { 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); //设置优先级 return true; } //设置代理信息 if ( !setup.bProxyUse ) { this->SetProxy(PROXYTYPE_NOPROXY); } else { if ( setup.lProxyType == 0 || //Sock 4 setup.lProxyType == 1 ) //Sock 4a //这两种代理不用用户名与密码 { #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 } } } //创建 this->Create(); //连接 BOOL res; srand(GetTickCount()); //分解IP及端口 #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; } /* //连接第二个有效端口 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(); } //关闭超透网关的句柄 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); //如果退出超时,强制结束线程 CloseHandle(m_hHttp); m_hHttp = INVALID_HANDLE_VALUE; } //清除队列中的内容 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; //已收到的Head字节数 m_lRecvFrame= 0; //已收到的Frame字节数 m_bRecvFrame= false; //开始时不是在收Frame; m_pRecvFrame= NULL; } BOOL CProcessSocket::SendFrame(unsigned char lFuncType, unsigned char *pFrame, unsigned long lFrameLen) { if ( !ConnectToServer(m_Setup) ) //连接到服务器,如果没连接,自动连接,如果连接上,则继续 { delete pFrame; return false; } Socket_Head * pHead = new Socket_Head; memset( pHead , 0 , sizeof(Socket_Head) ); pHead->lFuncType = lFuncType; //功能号 pHead->bCompress = m_lCompress; //是否压缩 //pHead->bCompress = false; //是否压缩 //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 ) //不使用超透网关时才使用Socket来发送数据 { AsyncSelect(FD_WRITE|FD_READ|FD_CLOSE); //请求一个写事件,以发送数据 //AsyncSelect(FD_READ | FD_CLOSE); } return true; } BOOL CProcessSocket::SendFrameEx(DWORD lFuncType, unsigned char *pFrame, unsigned long lFrameLen) { if ( !ConnectToServer(m_Setup) ) //连接到服务器,如果没连接,自动连接,如果连接上,则继续 { delete pFrame; return false; } #ifdef _UNICODE Socket_Head * pHead = new Socket_Head; memset( pHead , 0 , sizeof(Socket_Head) ); pHead->lFuncType = lFuncType; //功能号 pHead->bCompress = m_lCompress; //是否压缩 //pHead->bCompress = false; //是否压缩 //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; //增加头 BYTE * pFrame2 = pData + sizeof(Socket_Head_Add); //原数据 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; //功能号 //pHead->bCompress = SENDDATA_COMPRESS; //是否压缩 pHead->bCompress = false; //是否压缩 //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 ) //不使用超透网关时才使用Socket来发送数据 { AsyncSelect(FD_WRITE|FD_READ|FD_CLOSE); //请求一个写事件,以发送数据 //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秒发送超时 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 ) //发送错误 { if ( GetLastError() != WSAEWOULDBLOCK ) //绶区已满 return SOCKET_ERROR; } if ( lRet > 0 ) { lSended += lRet; if ( lSended >= nBufLen ) break; } else { Sleep( 50 ); //绶冲区已满,稍等 } 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 ) { //发送队列中的内容 while (!pPro->m_Frame.IsEmpty()) { Socket_Head * pHead = pPro->m_Frame.GetHead(); ULONG lSendFrameLen = pHead->lFrameLen; //最终需要发送的长度 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; //压缩成功,替换要发送的内容 pHead->pFrame = pFrame; pHead->lCompressLen = lCount; lSendFrameLen = lCount; //最终要发送的字节数 } else { delete pFrame; } } if ( bOK ) { //计算需要发送的字节数 long lSendBytes = (sizeof(Socket_Head)+lSendFrameLen)*2; //生成请求文件 char szBegin[256]={0};strcpy(szBegin,"SMS=");strcat(szBegin,REQHEAD); char szBegin2[256]={0};sprintf(szBegin2,"%010d",lSendBytes); strcat(szBegin,szBegin2); //头+长度+内容 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); //加入头 strcpy(pSend,szBegin); char * pSend2 = pSend + strlen(szBegin); //加入内容 AsciiToHex((char*)pHead ,pSend2,sizeof(Socket_Head));pSend2=pSend2+sizeof(Socket_Head)*2; AsciiToHex((char*)pHead->pFrame,pSend2,lSendFrameLen);pSend2=pSend2+lSendFrameLen*2; //加入尾 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); //设置代理 //设置代理用户名及密码 if ( pPro->m_Setup.bProxyUse ) //使用代理 { /* 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(); */ //处理接收到的信息 if (!strncmp(pRecv,REQHEAD,strlen(REQHEAD)) ) //接收到的是正确的消息 { //转换数据 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 ; i0 ) lGetLen = SHead.lCompressLen; if ( i+lGetLen>lDataLen) //数据不够 { break; } BYTE * pFrame = NULL; BOOL bOK = true; if ( SHead.lFuncType != SMSFUNC_TEST ) pPro->SetCompressType(SHead.bCompress); //取来自服务器的压缩选项 if ( SHead.bCompress>0 ) //解压 { 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; //解压不成功,不用通知收到帧 //解压不成功 delete pFrame; } } if ( SHead.bCompress == 2 ) { if ( uncompress( pFrame , &lCount , pData+i , lGetLen )!=Z_OK) { bOK = false; //解压不成功,不用通知收到帧 //解压不成功 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); //累了,休息一下。 } } catch(...) { //有异常,重新启动线程 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); //设置优先级 } 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; }