www.pudn.com > Read.rar > ProxyDlg.cpp
// ProxyDlg.cpp : implementation file // #include "stdafx.h" #include "Proxy.h" #include "ProxyDlg.h" #include#include "ExportFuncs.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CProxyDlg *pDlg; BOOL IsGprsOnline; BOOL IsSmsOnline; int RetryTimes; void AttachCbFunc(DWORD); void startup_cb_func(DWORD ret_code); void rev_sm_cb_func(CStringArray& sm_array); ///////////////////////////////////////////////////////////////////////////// // CProxyDlg dialog CProxyDlg::CProxyDlg(CWnd* pParent /*=NULL*/) : CDialog(CProxyDlg::IDD, pParent) { //{{AFX_DATA_INIT(CProxyDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_hTrayIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_TrayIcon.m_bIsWindowNormal = true; } void CProxyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProxyDlg) DDX_Control(pDX, IDC_EDIT_STATUS, m_Status); DDX_Control(pDX, IDC_EDIT_COUNT, m_Count); DDX_Control(pDX, IDC_LIST_VEHICLE, m_List); DDX_Control(pDX, IDOK, m_Connect); DDX_Control(pDX, IDC_BUTTON_QUERY, m_Query); DDX_Control(pDX, IDC_BUTTON_ENABLE, m_Enable); DDX_Control(pDX, IDC_BUTTON_DISABLE, m_Disable); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CProxyDlg, CDialog) //{{AFX_MSG_MAP(CProxyDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_WM_CLOSE() ON_WM_CREATE() ON_COMMAND(IDD_HIDE, OnHide) ON_COMMAND(IDD_SHOW, OnShow) ON_UPDATE_COMMAND_UI(IDD_SHOW, OnUpdateShow) ON_UPDATE_COMMAND_UI(IDD_HIDE, OnUpdateHide) ON_COMMAND(IDD_EXIT, OnExit) ON_BN_CLICKED(IDC_BUTTON_DISABLE, OnButtonDisable) ON_BN_CLICKED(IDC_BUTTON_ENABLE, OnButtonEnable) ON_BN_CLICKED(IDC_BUTTON_QUERY, OnButtonQuery) ON_MESSAGE(UM_SERVER,Tcp_Accept) ON_MESSAGE(UM_RECV,Tcp_Read) ON_MESSAGE(WM_TRAYNOTIFY,OnTrayNotification) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CProxyDlg message handlers BOOL CProxyDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon pDlg=this; if (!Variable_Init()) return FALSE; SetTimer(1,60000,NULL); m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_UNDERLINEHOT|LVS_REPORT); m_List.InsertColumn(0,"所在分控ID",LVCFMT_LEFT,80,2); m_List.InsertColumn(1,"车机类型",LVCFMT_LEFT,80,2); m_List.InsertColumn(2,"车机个数",LVCFMT_LEFT,80,2); /* CMenu menu; if(!menu.LoadMenu(m_TrayIcon.m_NotifyIconData.uID)) return true; CMenu* pSubMenu = menu.GetSubMenu(0); if(!pSubMenu) return true;*/ ::PostMessage(m_TrayIcon.m_NotifyIconData.hWnd,WM_COMMAND,IDD_HIDE,0); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CProxyDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } HCURSOR CProxyDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CProxyDlg::OnTimer(UINT nIDEvent) { switch (nIDEvent) { case 1: SendStatusQuery(); break; case 2: ShowWindow(SW_HIDE); KillTimer(2); break; } CDialog::OnTimer(nIDEvent); } BOOL CProxyDlg::ReadConfig() { char strTemp[81]; char Dir[150]; DWORD LenDir=sizeof(Dir); GetCurrentDirectory(LenDir,Dir); strcat(Dir,"\\Proxy.cfg"); LenDir=sizeof(Dir); TcpLst.TcpTotal=0; GetPrivateProfileString("Server","IP","",strTemp,sizeof(strTemp),Dir); if((strlen(strTemp)>20)||(strlen(strTemp)==0)) { AfxMessageBox("配置文件 内容错误!"); return FALSE; } strcpy(TcpLst.TcpMember[0].ServerIpAddr,strTemp); GetPrivateProfileString("Server","Port","",strTemp,sizeof(strTemp),Dir); if((strlen(strTemp)>20)||(strlen(strTemp)==0)) { AfxMessageBox("配置文件 内容错误!"); return FALSE; } TcpLst.TcpMember[0].ServerPort=atoi(strTemp); TcpLst.TcpMember[0].ServerSocketfd=-1; TcpLst.TcpTotal++; bWriteLog=TRUE; return TRUE; } BOOL CProxyDlg::Variable_Init() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { return FALSE; } if (!ReadConfig()) return FALSE; if (bWriteLog) { //////// 初始化日志文件和目录 ////////////// DWORD Len; Len=sizeof(LogDir); GetCurrentDirectory(Len,LogDir); strcat(LogDir,"\\log"); _mkdir(LogDir); if(!Daylog_Init()) return FALSE; } if (bWriteLog) { fprintf(daylogfd,"\n------------------------------------------\n"); fprintf(daylogfd,"----- System Start -----\n"); fprintf(daylogfd,"------------------------------------------\n"); fflush(daylogfd); } // if (!Tcp_Init()) // return FALSE; ConvertIp(); return TRUE; } BOOL CProxyDlg::Daylog_Init() { if (bWriteLog) { struct tm *tmp; time_t sectime; char tempfilestr[10],LogFileName[210]; FILE *fd; sectime=time(NULL); tmp=localtime(§ime); sprintf(tempfilestr,"%d.log",(tmp->tm_yday*100+tmp->tm_hour)); strcpy(LogFileName,LogDir); strcat(LogFileName,"\\"); strcat(LogFileName,tempfilestr); LastLogHour=tmp->tm_hour; if((fd=fopen(LogFileName,"a+"))==NULL) { perror("fopen"); fflush(stdout); return FALSE ; }else { daylogfd=fd; return TRUE; } } return TRUE; } void CProxyDlg::Daylog_Check() { if (bWriteLog) { struct tm *tmp; time_t sectime; char tempfilestr[10],LogFileName[210]; FILE *fd; sectime=time(NULL); tmp=localtime(§ime); if(LastLogHour==tmp->tm_hour) return; LastLogHour=tmp->tm_hour; ///////////////////////////////////////////////// // construct a new log file ///////////////////////////////////////////////// sprintf(tempfilestr,"%d.log",(tmp->tm_yday*100+tmp->tm_hour)); strcpy(LogFileName,LogDir); strcat(LogFileName,"\\"); strcat(LogFileName,tempfilestr); if((fd=fopen(LogFileName,"a+"))==NULL) { return ; }else { fclose(daylogfd); daylogfd=fd; } ///////////////////////////////////////////////// // delete file 48 hours ago ///////////////////////////////////////////////// if(tmp->tm_yday<=1) { sprintf(tempfilestr,"%d.log",((365+tmp->tm_yday-2)*100+tmp->tm_hour)); }else { sprintf(tempfilestr,"%d.log",((tmp->tm_yday-2)*100+tmp->tm_hour)); } strcpy(LogFileName,LogDir); strcat(LogFileName,"\\"); strcat(LogFileName,tempfilestr); if(fd=fopen(LogFileName,"r")) { fclose(fd); remove(LogFileName); } } } void CProxyDlg::Daylog_Close() { if (bWriteLog) { if(daylogfd!=NULL) fclose(daylogfd); } } void CProxyDlg::Variable_Release() { Tcp_Close(); if (bWriteLog) { fprintf(daylogfd,"\n------------------------------------------\n"); fprintf(daylogfd,"----- System Quit -----\n"); fprintf(daylogfd,"------------------------------------------\n"); fflush(daylogfd); } Daylog_Close(); } void CProxyDlg::OnClose() { //Variable_Release(); CDialog::OnClose(); } BOOL CProxyDlg::Tcp_Init() { /* int i; SOCKADDR_IN server[MAX_SERVER_LIST]; for(i=0;i Enable(!m_TrayIcon.m_bIsWindowNormal); } void CProxyDlg::OnUpdateHide(CCmdUI* pCmdUI) { pCmdUI->Enable(m_TrayIcon.m_bIsWindowNormal); } void CProxyDlg::OnExit() { DestroyWindow(); } void CProxyDlg::OnButtonDisable() { CPktB SendData; SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr); SendData.sid=htonl(MyIp); SendData.centerid=htons(0x2900); SendData.type=htons(0x8203); SendData.version=0x30; commsend(SendData,13); } void CProxyDlg::OnButtonEnable() { CPktB SendData; SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr); SendData.sid=htonl(MyIp); SendData.centerid=htons(0x2900); SendData.type=htons(0x8202); SendData.version=0x30; commsend(SendData,13); } void CProxyDlg::OnButtonQuery() { CPktB SendData; SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr); SendData.sid=htonl(MyIp); SendData.centerid=htons(0x2900); SendData.type=htons(0x8200); SendData.version=0x30; commsend(SendData,13); } void CProxyDlg::OnOK() { if (ConnectToServer(0,0)) m_Connect.EnableWindow(FALSE); } void CProxyDlg::DoEvent(char buf[], int buflen) { CPktB RecvData; CVehicleType VehicleType; char sTemp[20]; static int Count=0; CSock5 Sock5Data; if (buflen<2) return; if ((buf[0]==0x7e)&&(buf[buflen-1]==0x7e)) { memcpy((void *)&RecvData,buf+1,buflen-3); switch (htons(RecvData.type)) { case 0x8240: if (RecvData.userdata.Nm_8240pkt1.type==1) { for (int i=0;i h_addr_list)); MyIp=inet_addr(Ip); } void CProxyDlg::commsend(CPktB SendData, int iLen) { if (TcpLst.TcpMember[0].ServerSocketfd==-1) AfxMessageBox("请先连接服务器"); else { int Len; char TempOld[MAX_LEN],TempNew[MAX_LEN]; memcpy(TempOld,(char*)&SendData,iLen); Len=AddFsynToBuf(TempOld,TempNew,iLen); Tcp_Write(0,TRUE,TempNew,Len); } } int CProxyDlg::AddFsynToBuf(char OldBuf[], char NewBuf[], int Len) { int Len_Temp=1,i; char OldBuf_Temp[MAX_LEN+2]; unsigned short CheckSum=Get_CheckSum(OldBuf,Len); memcpy((void *)OldBuf_Temp,(void *)OldBuf,Len); CheckSum=htons(CheckSum); memcpy((void *)(OldBuf_Temp+Len),(void *)&CheckSum,2); for(i=0;i =0;i--) { if(newbuf[i]!=0x20) break; } if(i>=0) newbuf[i+1]=0; else newbuf[0]=0; } void CProxyDlg::SendStatusQuery() { if (TcpLst.TcpMember[0].ServerSocketfd!=-1) { CPktB SendData; SendData.did=inet_addr(TcpLst.TcpMember[0].ServerIpAddr); SendData.sid=htonl(MyIp); SendData.centerid=htons(0x2900); SendData.type=htons(0x8204); SendData.version=0x30; commsend(SendData,13); SendData.type=htons(0x1101); commsend(SendData,13); } } void CProxyDlg::commsend(CSock5 SendData, int iLen) { Tcp_Write(0,TRUE,(char*)&SendData,iLen); }