下面给出部分程序的源代码(用… …略去了VC++自动生成的代码): ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// OpenUnixDoorDlg.h : header file/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**OpenUnixDoor Developer: DING Xiaoping*Send comments and/or bug reports to: northsouth@163.com*/ #include <Afxmt.h> //add for Cevent //通信原语const unsigned char IAC_IS = '0';const unsigned char IAC_SEND = '1';const unsigned char IAC_INFO = '2';const unsigned char IAC_VAR = '0';const unsigned char IAC_VALUE = '1';const unsigned char IAC_ESC = '2';const unsigned char IAC_USERVAR = '3';const unsigned char IAC_SE = 240;const unsigned char IAC_NOP = 241;const unsigned char IAC_DataMark = 242;const unsigned char IAC_BRK = 243;const unsigned char IAC_IP = 244;const unsigned char IAC_AO = 245;const unsigned char IAC_AYT = 246;const unsigned char IAC_EC = 247;const unsigned char IAC_EL = 248;const unsigned char IAC_GA = 249;const unsigned char IAC_SB = 250;const unsigned char IAC_WILL = 251;const unsigned char IAC_WONT = 252;const unsigned char IAC_DO = 253;const unsigned char IAC_DONT = 254;const unsigned char IAC_IAC = 255;//#define MAX_BUFFER 1024#define MAX_LINELENGTH 100#define SETPRATE " \t\n\r"//// COpenUnixDoorDlg dialogclass CClientSocket;class COpenUnixDoorDlg : public CDialog{// Constructionpublic: void InitDlg();///////////////////////////for NVT COpenUnixDoorDlg(CWnd* pParent = NULL); // standard constructor BOOL ReceiveData(CClientSocket *pClSt); //Receive data for server BOOL SendData(CString strSend); //Send data to server BOOL ProcessOption(); //Process option. int ProcessLine(unsigned char *cBuffer,int iRecv,int& iProcess); void ArrangeReply(CString strOption); void RespondToOptions(); int Find(CString str, char ch); void ReConnect();//////////////////////////for logon BOOL Logon(); //logon unix BOOL GetUserInput(); BOOL GetPassChar(CString strSelect); BOOL RepairSocket(); void CloseSocket(); void LockView();/////////////////////////for NVT unsigned char cBuffer[MAX_BUFFER]; //copy data from socket CString strRecvData; //receive's data CString strSendData; // for send CString strDisplay; // for display CStringList m_ListOptions; // for option BOOL bNegotiating; BOOL bOptionsSent; CString m_strResp;///////////////////////for password and user CString strHostName; //host CString strPassDir; //密码文件路径 CString strUserDir; //用户名文件路径 CString strPassCount; //密码字符数 int iAlreadyPassC; CString strPassChar; CString strUserName; int iCheckUser; //IDC_CHECK_USER BOOL bUserFinished; //TRUE:FINISHED,FAILED:NO FINISHED; BOOL bPassFinished; //TRUE:FINISHED,FAILED:NO FINISHED; BOOL bIsStop; //TRUE:YES;///////////////////////for password and user // Dialog Data //{{AFX_DATA(COpenUnixDoorDlg) enum { IDD = IDD_OPENUNIXDOOR_DIALOG }; CSpinButtonCtrl m_SpinPass; CComboBox m_ComPass; CButton m_CheckUser; int m_iPassCount; //}}AFX_DATA //{{AFX_VIRTUAL(COpenUnixDoorDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementationprotected: HICON m_hIcon; CClientSocket *pSocket; // Generated message map functions //{{AFX_MSG(COpenUnixDoorDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnBtBegin(); afx_msg void OnBtExit(); afx_msg void OnBtUserdir(); afx_msg void OnCheckUser(); afx_msg void OnBtPassdir(); afx_msg void OnSelendokComboPass(); afx_msg void OnBtStop(); afx_msg void OnBtHelp(); //}}AFX_MSG DECLARE_MESSAGE_MAP()}; /////////////////////////////////////////////////////////////////////////////// CHelpDlg dialog class CHelpDlg : public CDialog{// Constructionpublic: CHelpDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CHelpDlg) enum { IDD = IDD_DIALOG_HELP }; CEdit m_Edit_HelpCtr; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHelpDlg) public: virtual int DoModal(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementationprotected: // Generated message map functions //{{AFX_MSG(CHelpDlg) virtual BOOL OnInitDialog(); afx_msg void OnBtMypro(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// OpenUnixDoorDlg.cpp /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**OpenUnixDoor Developer: DING Xiaoping*Send comments and/or bug reports to: northsouth@163.com*/ #include "stdafx.h"#include "OpenUnixDoor.h"#include "OpenUnixDoorDlg.h"#include "ClientSocket.h" //this for debug#define DXPDEBUG 1 //调试设置#if DXPDEBUG FILE *fp=NULL; //调试输出文件#endif //定义同步及临界资源 CEvent gEventNextPass; //取下一个密码,为实现同步引进 CEvent gEventPassOk; //已取得密码,为实现同步引进 CEvent gEventNextUser; //取下一个用户名,为实现同步引进 CEvent gEventUserOk; //已取得用户名,为实现同步引进 CEvent gEventDisConncet; CString strCurPass; //当前密码 CString strCurUser; //当前用户名//定义线程 CWinThread *pUserThread = NULL, //枚举用户名线程 *pPassWordThread = NULL, //枚举用户密码线程 *pLogonThread = NULL; //登录线程 UINT UserThread(COpenUnixDoorDlg *pDlg); UINT PassWordThread(COpenUnixDoorDlg *pDlg); UINT PassWordThreadF(COpenUnixDoorDlg *pDlg); UINT LogonThread(COpenUnixDoorDlg *pDlg);/////////////////////////////////////////////////////////////////////////////… …/////////////////////////////////////////////////////////////////////////////// COpenUnixDoorDlg dialog COpenUnixDoorDlg::COpenUnixDoorDlg(CWnd* pParent /*=NULL*/) : CDialog(COpenUnixDoorDlg::IDD, pParent){ //{{AFX_DATA_INIT(COpenUnixDoorDlg) m_iPassCount = 1; //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);} void COpenUnixDoorDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COpenUnixDoorDlg) DDX_Control(pDX, IDC_SPIN_PASS, m_SpinPass); DDX_Control(pDX, IDC_COMBO_PASS, m_ComPass); DDX_Control(pDX, IDC_CHECK_USER, m_CheckUser); DDX_Text(pDX, IDC_ET_PASSCOUNT, m_iPassCount); DDV_MinMaxInt(pDX, m_iPassCount, 1, 12); //}}AFX_DATA_MAP} BEGIN_MESSAGE_MAP(COpenUnixDoorDlg, CDialog)… …END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////// COpenUnixDoorDlg message handlers BOOL COpenUnixDoorDlg::OnInitDialog(){… … InitDlg(); return TRUE; // return TRUE unless you set the focus to a control}void COpenUnixDoorDlg::InitDlg(){ CString s1; GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE); GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE); s1.LoadString(IDS_PASS_ALLNUMBER); //所有数字字符; m_ComPass.AddString(s1.operator LPCTSTR());//0 m_ComPass.SetCurSel(0); s1.LoadString(IDS_PASS_ZIDINGYI); //自定义字符集; m_ComPass.AddString(s1.operator LPCTSTR());//1 s1.LoadString(IDS_PASS_ZIDIAN); //字典; m_ComPass.AddString(s1.operator LPCTSTR());//2 s1.LoadString(IDS_PASS_ALLENLOW); //所有小写英文字符; m_ComPass.AddString(s1.operator LPCTSTR());//3 s1.LoadString(IDS_PASS_ALLENUP); //所有大写英文字符; m_ComPass.AddString(s1.operator LPCTSTR());//4 s1.LoadString(IDS_PASS_NUMANDLOW); //数字和英文小写混合; m_ComPass.AddString(s1.operator LPCTSTR());//5 s1.LoadString(IDS_PASS_NUMANDLOWUP); //数字和英文大小写混合 m_ComPass.AddString(s1.operator LPCTSTR());//6 s1.LoadString(IDS_PASS_ALL); //所有键盘可输入字符; m_ComPass.AddString(s1.operator LPCTSTR());//7 m_SpinPass.SetBuddy(GetDlgItem(IDC_ET_PASSCOUNT)); m_SpinPass.SetRange(1,12); iAlreadyPassC=0; bIsStop=FALSE; CTime t=CTime::GetCurrentTime(); s1=t.Format("%H:%M:%S"); SetDlgItemText(IDC_STC_BEGINTIME,s1); pSocket=NULL; #if DXPDEBUG SetDlgItemText(IDC_ET_HOSTNAME,"192.168.42.63"); SetDlgItemText(IDC_ET_USERNAME,"ods"); SetDlgItemText(IDC_ET_PASSFLDIR,"dos"); SetDlgItemInt(IDC_ET_PASSCOUNT,3,FALSE);#endif}void COpenUnixDoorDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); }} void COpenUnixDoorDlg::OnPaint() { … …} HCURSOR COpenUnixDoorDlg::OnQueryDragIcon(){ return (HCURSOR) m_hIcon;} void COpenUnixDoorDlg::OnBtBegin() {#if DXPDEBUG fp=fopen("dxpdebug.txt","w"); fprintf(fp,"%s is ip addr.",strHostName.operator LPCTSTR());#endif CString s1,s2; if( ! GetUserInput() ) return; //建立用户名线程,枚举用户名线程 bUserFinished = TRUE ; if( iCheckUser ){ pUserThread = AfxBeginThread((AFX_THREADPROC)UserThread, (LPVOID)this, THREAD_PRIORITY_NORMAL); if( pUserThread == NULL ){ s1.LoadString(IDS_THREADERRO); s2.LoadString(IDS_MESSAGE_CAPTION); MessageBox(s1,s2); return ; } pUserThread->m_bAutoDelete = TRUE; bUserFinished = FALSE; } //建立密码线程,枚举用户密码线程 bPassFinished=TRUE; s1.LoadString(IDS_PASS_ZIDIAN); m_ComPass.GetWindowText(s2); if( s1 == s2){ pPassWordThread = AfxBeginThread((AFX_THREADPROC)PassWordThreadF, (LPVOID)this, THREAD_PRIORITY_NORMAL); }else{ GetPassChar( s2 ); pPassWordThread = AfxBeginThread((AFX_THREADPROC)PassWordThread, (LPVOID)this, THREAD_PRIORITY_NORMAL); } if( pPassWordThread == NULL ) { s1.LoadString(IDS_THREADERRO); s2.LoadString(IDS_MESSAGE_CAPTION); MessageBox(s1,s2); return ; } pPassWordThread->m_bAutoDelete=FALSE; bPassFinished=FALSE; //建立登录线程 RepairSocket(); LockView(); //界面控制线程 } BOOL COpenUnixDoorDlg::ReceiveData(CClientSocket *pClSt){ int iRecv,iProc; iProc = 0; iRecv = pClSt->Receive(cBuffer,MAX_BUFFER); if(SOCKET_ERROR != iRecv) { ProcessLine(cBuffer,iRecv,iProc); //处理接收的数据 ProcessOption(); //处理接收数据中的协议数据 Logon(); //完成尝试登录 } strRecvData.Empty(); strDisplay.Empty(); return 1;} BOOL COpenUnixDoorDlg::SendData(CString strSend){ //向服务器发送数据 pSocket->Send(strSend,strSend.GetLength()); return 1;} BOOL COpenUnixDoorDlg::ProcessOption(){ //处理协议数据 CString m_strTemp; CString m_strOption; unsigned char ch; int ndx; int ldx; BOOL bScanDone = FALSE; m_strTemp = strRecvData; while( !m_strTemp.IsEmpty() && bScanDone != TRUE) { ndx = m_strTemp.Find(IAC_IAC); if(ndx != -1) { strDisplay += m_strTemp.Left( ndx ); ch = m_strTemp.GetAt( ndx + 1 );//////////////////////////////////////////////#if DXPDEBUG switch(ch) { case IAC_NOP: fprintf(fp, "got a DataMark\r\n"); break; case IAC_DataMark: fprintf(fp, "got a DataMark\r\n"); break; case IAC_BRK: fprintf(fp, "got a BRK\r\n"); break; case IAC_IP: fprintf(fp, "got a IP\r\n"); break; case IAC_AO: fprintf(fp, "got a AO\r\n"); break; case IAC_AYT: fprintf(fp, "got a AYT\r\n"); break; case IAC_EC: fprintf(fp, "got a EC\r\n"); break; case IAC_EL: fprintf(fp, "got a EL\r\n"); break; case IAC_GA: fprintf(fp, "got a GA\r\n"); break; case IAC_SB: fprintf(fp, "got a IAC_SB\r\n"); break; case IAC_IAC: fprintf(fp, "got a IAC\r\n"); break; default: fprintf(fp, "%s got unknown command (%d)\r\n",strDisplay.operator LPCTSTR ()); }#endif////////////////////////////////////////////////////////////////// switch(ch) { case IAC_DO: case IAC_DONT: case IAC_WILL: case IAC_WONT: m_strOption = m_strTemp.Mid(ndx, 3);#if DXPDEBUG fprintf(fp, "WONT:%s\r\n",m_strOption.operator LPCTSTR ());#endif m_strTemp = m_strTemp.Mid(ndx + 3); strDisplay= m_strTemp.Left(ndx); m_ListOptions.AddTail(m_strOption); break; case IAC_IAC: strDisplay = m_strTemp.Left(ndx); m_strTemp = m_strTemp.Mid(ndx + 1);#if DXPDEBUG fprintf(fp, "IAC: Option\r\n",m_strTemp.operator LPCTSTR ());#endif break; case IAC_SB: strDisplay = m_strTemp.Left(ndx); ldx = Find(m_strTemp, IAC_SE); m_strOption = m_strTemp.Mid(ndx, ldx);#if DXPDEBUG fprintf(fp, "SB:%s\r\n",m_strOption.operator LPCTSTR ());#endif m_ListOptions.AddTail(m_strOption); m_strTemp = m_strTemp.Mid(ldx); // AfxMessageBox(m_strOption,MB_OK); break; default: bScanDone = TRUE; } } else { strDisplay = m_strTemp;#if DXPDEBUG fprintf(fp, "normaltext:%s\r\n",m_strTemp.operator LPCTSTR ());#endif // AfxMessageBox(m_strNormalText,MB_OK); bScanDone = TRUE; } } RespondToOptions(); return 1;} int COpenUnixDoorDlg::ProcessLine(unsigned char *cBuffer,int iRecv,int& iProcess){ BOOL bLine = FALSE; unsigned char ch; while ( bLine == FALSE && iProcess < iRecv ) { ch= cBuffer[iProcess]; //Window switch( ch ) { case '\r': // ignore strRecvData += "\r\n"; //"CR"; break; case '\n': // end-of-line break; default: // other.... strRecvData += ch; break; } iProcess ++; if (iProcess == iRecv) { bLine = TRUE; } } return bLine;} void COpenUnixDoorDlg::RespondToOptions(){ CString strOption; while(!m_ListOptions.IsEmpty()) { strOption = m_ListOptions.RemoveHead(); ArrangeReply(strOption); } SendData(strSendData); m_strResp.Empty();} void COpenUnixDoorDlg::ArrangeReply(CString strOption){ unsigned char Verb; unsigned char Option; unsigned char Modifier; unsigned char ch; BOOL bDefined = FALSE; if(strOption.GetLength() < 3) return; Verb = strOption.GetAt(1); Option = strOption.GetAt(2); switch(Option) { case 1: // Echo case 3: // Suppress Go-Ahead bDefined = TRUE; break; } m_strResp += IAC_IAC; if(bDefined == TRUE) { switch(Verb) { case IAC_DO: ch = IAC_WILL; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "DO: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_DONT: ch = IAC_WONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "DONT: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_WILL: ch = IAC_DO; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "WILL: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_WONT: ch = IAC_DONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "WONT: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_SB: Modifier = strOption.GetAt(3); if(Modifier == IAC_SEND) { ch = IAC_SB; m_strResp += ch; m_strResp += Option; m_strResp += IAC_IS; m_strResp += IAC_IAC; m_strResp += IAC_SE; }#if DXPDEBUG fprintf(fp, "SB: ch:%d Option:%d \r\n",ch,Option);#endif break; } } else { switch(Verb) { case IAC_DO: ch = IAC_WONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "DO: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_DONT: ch = IAC_WONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "DONT: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_WILL: ch = IAC_DONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "WILL: ch:%d Option:%d\r\n",ch,Option);#endif break; case IAC_WONT: ch = IAC_DONT; m_strResp += ch; m_strResp += Option;#if DXPDEBUG fprintf(fp, "WONT: ch:%d Option:%d\r\n",ch,Option);#endif break; } }} int COpenUnixDoorDlg::Find(CString str, char ch){ char* data = str.GetBuffer(0); int len = str.GetLength(); int i = 0; for(i = 0; i < len; i++){ if(data[i] == ch) break; } str.ReleaseBuffer(); return i;} void COpenUnixDoorDlg::OnBtExit() {#if DXPDEBUG if(fp!=NULL)fclose(fp);#endif //删除所有线程 … … if(pSocket != NULL) delete pSocket; pSocket = NULL; CDialog::OnOK();} UINT UserThread(COpenUnixDoorDlg *pDlg){ FILE *fUser; char cUser[MAX_LINELENGTH]; char *token; CString s1,s2; CString strDir = pDlg->strUserDir; strDir.Replace("\\","\\\\"); //strDir保存用户名的路径及文件名 if( NULL == (fUser = fopen(strDir.operator LPCTSTR(),"r+"))) { s1.LoadString(IDS_OPENFILEERRO); s2.LoadString(IDS_MESSAGE_CAPTION); strDir.Format(s1,strDir.operator LPCTSTR()); MessageBox(GetActiveWindow(),strDir,s2,0); if(fUser != NULL) fclose(fUser); pDlg->bUserFinished = TRUE; return 0; } while( ! feof( fUser ) ) { if( NULL == fgets( cUser,MAX_LINELENGTH,fUser )) { fclose( fUser ); pDlg->bUserFinished = TRUE; return 0; } token = strtok( cUser,SETPRATE );// #define SETPRATE " \t\n\r" do { WaitForSingleObject(gEventNextUser,INFINITE); // 等待“新用户名”事件 gEventNextUser.ResetEvent(); //复位。 strCurUser = token; //改变当前用户名。 gEventUserOk.SetEvent(); //发送“用户名完成”事件 }while((token = strtok(NULL,SETPRATE)) != NULL); }//while end pDlg->bUserFinished = TRUE; gEventUserOk.SetEvent(); return 0; } UINT PassWordThread(COpenUnixDoorDlg *pDlg){/******* strPass-> | a | b | c | d |** \/ | ** /\ | ** iPPos | 1 | 0 | 2 |**** 例如:str="abcd",iCount=3,当iPPos=102 时表示字串"bac"***/ int j; int iCount=pDlg->m_iPassCount; int k=iCount-1; CString strPass=pDlg->strPassChar; int iPCount=strPass.GetLength() ; CString strTemp; int iPPos[MAX_LINELENGTH]; for(j = 0;( j<MAX_LINELENGTH ); j++ ) iPPos[j] = 0; do{ while( iPPos[0] < iPCount ) { while( iPPos[k] < iPCount ){ strTemp.Empty(); for(j = 0;j < iCount; j++ ){ strTemp.Insert(j,strPass.GetAt(iPPos[j])); } WaitForSingleObject(gEventNextPass,INFINITE); // 等待“新密码”事件 gEventNextPass.ResetEvent(); //复位。 strCurPass=strTemp; //改变当前密码。 gEventPassOk.SetEvent(); //送密码完成事件 #if DXPDEBUG fprintf(fp, "%s\r\n",strCurPass.operator LPCTSTR ());#endif iPPos[k]++; } iPPos[k] = 0; //末位清零 for(j = iCount-2;j >= 0;j--) { if(( iPPos[j]+=1 )==iPCount && j != 0 ) iPPos[j] = 0; else break; //完成iCount进制加法运算 } }//while if(!pDlg->bUserFinished){ gEventNextUser.SetEvent(); //发送“新用户名”事件 WaitForSingleObject(gEventUserOk,INFINITE); //等待“用户名完成”事件 gEventUserOk.ResetEvent(); //复位。 } }while(!pDlg->bUserFinished); pDlg->bPassFinished=TRUE; gEventPassOk.SetEvent(); return 0;} UINT PassWordThreadF(COpenUnixDoorDlg *pDlg){ FILE *fPass; char cPass[MAX_LINELENGTH]; char *token; CString s1,s2; CString strFile=pDlg->strPassDir; strFile.Replace("\\","\\\\"); //strFile保存密码文件的路径及文件名 if(NULL == ( fPass = fopen(strFile.operator LPCTSTR(),"r+")) ) { s1.LoadString(IDS_OPENFILEERRO); s2.LoadString(IDS_MESSAGE_CAPTION); strFile.Format(s1,strFile.operator LPCTSTR()); MessageBox(GetActiveWindow(),strFile,s2,0); if( fPass != NULL ) fclose( fPass ); pDlg->bPassFinished=TRUE; return 0; } do{ while(!feof(fPass)) { if(NULL==fgets(cPass,MAX_LINELENGTH,fPass)) { fclose(fPass); break; } token=strtok(cPass,SETPRATE);// #define SETPRATE " \t\n\r" do { WaitForSingleObject(gEventNextPass,INFINITE); // 等待“新用户密码”事件 gEventNextPass.ResetEvent(); //复位。 strCurPass=token; //改变当前用户密码。 gEventPassOk.SetEvent(); //发送“用户密码完成”事件 }while((token=strtok(NULL,SETPRATE))!=NULL); }//while if(!pDlg->bUserFinished){ gEventNextUser.SetEvent(); //发送“新用户名”事件 WaitForSingleObject(gEventUserOk,INFINITE); //等待“用户名完成”事件 gEventUserOk.ResetEvent(); //复位。 } }while(!pDlg->bUserFinished); pDlg->bPassFinished=TRUE; gEventPassOk.SetEvent(); return 0; } UINT LogonThread(COpenUnixDoorDlg *pDlg){ pDlg->ReConnect(); return 0;} void COpenUnixDoorDlg::ReConnect(){ BOOL bOK; if(pSocket != NULL)delete pSocket; pSocket=new CClientSocket(this) ; if( pSocket != NULL){ bOK=pSocket->Create(); if(bOK == TRUE){ bOK = pSocket->AsyncSelect(FD_READ | FD_WRITE| FD_CLOSE | FD_CONNECT | FD_OOB); bOK = pSocket->Connect(strHostName,23); }else{ delete pSocket; } }else{ AfxMessageBox("Could not create new socket",MB_OK); } } BOOL COpenUnixDoorDlg::GetUserInput(){ CString s1; CString s2; s2.LoadString(IDS_MESSAGE_CAPTION); //check hostname GetDlgItemText(IDC_ET_HOSTNAME,strHostName); if(strHostName.IsEmpty()){ s1.LoadString(IDS_MESSAGE1); MessageBox(s1,s2); return FALSE; } //check user name or user dir if(m_CheckUser.GetCheck()){ GetDlgItemText(IDC_ET_USERDIR,strUserDir); if(strUserDir.IsEmpty()){ s1.LoadString(IDS_MESSAGE2); MessageBox(s1,s2); return FALSE; } }else{ GetDlgItemText(IDC_ET_USERNAME,strCurUser); if(strCurUser.IsEmpty()){ s1.LoadString(IDS_MESSAGE2); MessageBox(s1,s2); return FALSE; } } iCheckUser=m_CheckUser.GetCheck(); // m_iPassCount = GetDlgItemInt(IDC_ET_PASSCOUNT); //check password GetDlgItemText(IDC_ET_PASSFLDIR,strPassDir); return TRUE;} void COpenUnixDoorDlg::OnBtUserdir() { CFileDialog m_dlg(IDS_INPUTDIR); if( m_dlg.DoModal() ){ CString str = m_dlg.GetPathName(); SetDlgItemText(IDC_ET_USERDIR,str.operator LPCTSTR()); }} void COpenUnixDoorDlg::OnCheckUser() { if(m_CheckUser.GetCheck()) { GetDlgItem(IDC_ET_USERDIR)->EnableWindow(TRUE); GetDlgItem(IDC_BT_USERDIR)->EnableWindow(TRUE); GetDlgItem(IDC_ET_USERNAME)->EnableWindow(FALSE); }else{ GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_ET_USERNAME)->EnableWindow(TRUE); }} void COpenUnixDoorDlg::OnBtPassdir() { CFileDialog m_dlg(IDS_INPUTDIR); if( m_dlg.DoModal() ){ CString str=m_dlg.GetPathName(); SetDlgItemText(IDC_ET_PASSFLDIR,str.operator LPCTSTR()); }} void COpenUnixDoorDlg::OnSelendokComboPass() { CString s1,s2,s3; s1.LoadString(IDS_PASS_ZIDIAN); s2.LoadString(IDS_PASS_ZIDINGYI); m_ComPass.GetWindowText(s3); if(s1==s3 || s2==s3){ GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(TRUE); if(s2 == s3){ GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE); }else{ GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(TRUE); } }else{ GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE); GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE); }} BOOL COpenUnixDoorDlg::GetPassChar(CString strSelect){ CString s1; s1.LoadString(IDS_PASS_ZIDINGYI); if(strSelect == s1){ GetDlgItemText(IDC_ET_PASSFLDIR,strPassChar) ;return TRUE; } s1.LoadString(IDS_PASS_ALLNUMBER); if(strSelect==s1){ strPassChar="0123456789";return TRUE; } s1.LoadString(IDS_PASS_ALLENLOW); if(strSelect==s1){ strPassChar="abcdefghigklmnopqrstuvwxyz"; return TRUE; } s1.LoadString(IDS_PASS_ALLENUP); if(strSelect==s1){ strPassChar="ABCDEFGHIGKLMNOPQRSTUVWXYZ"; return TRUE; } s1.LoadString(IDS_PASS_NUMANDLOW); if(strSelect == s1){ strPassChar = "0123456789abcdefghigklmnopqrstuvwxyz"; return TRUE; } s1.LoadString(IDS_PASS_NUMANDLOWUP); if(strSelect == s1){ strPassChar = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ"; return TRUE; } s1.LoadString(IDS_PASS_ALL); if(strSelect == s1){ strPassChar = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ`~!@#$%^&*()-=\\_+|[]{};':\",./<>?"; return TRUE; } return FALSE;} BOOL COpenUnixDoorDlg::RepairSocket(){ BOOL bOK; pSocket = new CClientSocket(this) ; if(pSocket != NULL){ bOK = pSocket->Create(); if(bOK == TRUE){ pSocket->AsyncSelect(FD_READ | FD_WRITE| FD_CLOSE | FD_CONNECT | FD_OOB); pSocket->Connect(strHostName,23); }else{ delete pSocket; } }else{ AfxMessageBox("Could not create new socket",MB_OK); } return TRUE;} void COpenUnixDoorDlg::CloseSocket(){ //gEventDisConncet.SetEvent(); CString strTemp; strTemp.LoadString(IDS_YOUAREFAILED); AfxMessageBox(strTemp); } void COpenUnixDoorDlg::OnBtStop() { static int i=0; CString str; if(i == 0) { //MUST STOP SOKET bIsStop=TRUE; pSocket->OnClose(0); if(pUserThread != NULL) pUserThread->SuspendThread(); //枚举用户名线程 if(pPassWordThread != NULL) pPassWordThread->SuspendThread(); //枚举用户密码线程 //if(pLogonThread!=NULL)pLogonThread->SuspendThread(); //登录线程 str.LoadString(IDS_REBEGIN); SetDlgItemText(IDC_BT_STOP,str); i=1; }else{ bIsStop = FALSE; gEventDisConncet.SetEvent(); if(pUserThread != NULL) pUserThread->ResumeThread(); if(pPassWordThread != NULL) pPassWordThread->ResumeThread(); //if(pLogonThread!=NULL)pLogonThread->ResumeThread(); str.LoadString(IDS_STOP); SetDlgItemText(IDC_BT_STOP,str); i = 0; }} void CAboutDlg::OnOK() { CDialog::OnOK();} void COpenUnixDoorDlg::OnBtHelp() { CHelpDlg dlg; dlg.DoModal();} void COpenUnixDoorDlg::LockView(){ GetDlgItem(IDC_ET_HOSTNAME)->EnableWindow(FALSE); GetDlgItem(IDC_ET_USERNAME)->EnableWindow(FALSE); GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_USER)->EnableWindow(FALSE); GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_PASS)->EnableWindow(FALSE); GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE); GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE); GetDlgItem(IDC_ET_PASSCOUNT)->EnableWindow(FALSE); GetDlgItem(IDC_SPIN_PASS)->EnableWindow(FALSE); GetDlgItem(IDC_BT_BEGIN)->EnableWindow(FALSE); }/////////////////////////////////////////////////////////////////////////////// CHelpDlg dialog… …/////////////////////////////////////////////////////////////////////////////// CHelpDlg message handlers int CHelpDlg::DoModal() { return CDialog::DoModal();} BOOL CHelpDlg::OnInitDialog() { CDialog::OnInitDialog(); CString strHelp; strHelp.LoadString(IDS_HELP); m_Edit_HelpCtr.ReplaceSel(strHelp.operator LPCTSTR()); return TRUE; // return TRUE unless you set the focus to a control} void CHelpDlg::OnBtMypro() { CAboutDlg dlg; dlg.DoModal();} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ClientSocket.h : header file///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**OpenUnixDoor Developer: DING Xiaoping*Send comments and/or bug reports to: northsouth@163.com*/ class COpenUnixDoorDlg;class CClientSocket : public CAsyncSocket{… …public: CClientSocket(COpenUnixDoorDlg *pDlg); virtual ~CClientSocket(); // Overridespublic: COpenUnixDoorDlg *lpDlg; // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CClientSocket) public: virtual void OnClose(int nErrorCode); virtual void OnOutOfBandData(int nErrorCode); virtual void OnReceive(int nErrorCode); virtual void OnSend(int nErrorCode); //}}AFX_VIRTUAL // Generated message map functions //{{AFX_MSG(CClientSocket) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG // Implementationprotected:}; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ClientSocket.cpp /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**OpenUnixDoor Developer: DING Xiaoping*Send comments and/or bug reports to: northsouth@163.com*/ #include "stdafx.h"#include "OpenUnixDoor.h"#include "ClientSocket.h"#include "OpenUnixDoorDlg.h" CClientSocket::CClientSocket(COpenUnixDoorDlg *pDlg){ lpDlg=pDlg;} void CClientSocket::OnClose(int nErrorCode) { CAsyncSocket::OnClose(nErrorCode); if(lpDlg->bPassFinished)lpDlg->CloseSocket(); //else if(lpDlg->bIsStop)return ; else lpDlg->ReConnect();} void CClientSocket::OnOutOfBandData(int nErrorCode) { CAsyncSocket::OnOutOfBandData(nErrorCode);} void CClientSocket::OnReceive(int nErrorCode) { lpDlg->ReceiveData(this);} void CClientSocket::OnSend(int nErrorCode) { CAsyncSocket::OnSend(nErrorCode);}

评论