




免费预览已结束,剩余53页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.4 MFC WinInet类应用程序编程实例在因特网上有很多FTP服务器,他们存有丰富的软件和信息资源,至今仍然是因特网提供的主要服务之一。现在也有很多FTP客户端软件,比如CuteFtp程序等,本小节就通过一个使用MFC WinInet类编制的FTP客户端程序的例子,说明MFC WinInet应用程序的编程方法。6.4.1 程序要实现的功能程序能实现基本的FTP客户端功能,能登陆FTP服务器,显示登录客户目录下的文件和目录名,能从该目录中选择下载服务器的文件,也能向服务器上传文件。应用程序的类型是基于对话框的,主对话框用户界面如图6.10所示:图6.10 Ftp客户端程序的主对话框三个文本编辑框,分别用于输入FTP服务器域名,登录用户名和登录口令。一个列表框,用来显示FTP服务器当前目录的内容,并允许用户从中选择文件下载。四个命令按钮分别执行查询、上传、下载和退出的功能。用户执行程序的流程是:进行各种操作之前,应首先输入服务器域名,登录用户名和口令。如果要进行查询,可以点击查询按钮,调用OnQuery函数。该函数获得用户当前输入的服务器名、登录用户名和口令等信息,清除列表框的内容;然号创建Internet会话类对象,进行服务器的登录,试图建立与指定FTP服务器的连接;如果连接成功,就创建CFtpFileFind文件检索类对象,查找服务器上当前目录的任意文件,找到了第一个文件后,继续找其它的文件,并将找到的文件或目录名显示在列表框中。所有文件找到后,结束查询,并依次删除文件查询对象、FTP连接对象和Internet 会话对象,结束会话。此时,可以从服务器下载文件。从列表框中选择一个文件,会产生LBN_SELCHANGE事件,自动调用相应的OnSelchangeListFile函数,禁用用来输入的文本框控件,禁用查询和上传按钮,激活下载按钮。此时,用户可以点击下载按钮,产生BN_CLICKED事件,自动调用OnDownload函数,调用Download函数,下载该文件。下载完毕,禁用下载按钮,激活查询和上传按钮,激活用来输入的文本框控件。而Download函数重新创建Internet会话,建立FTP连接,下载文件后,将会话对象和连接对象清除。如果要向FTP服务器上传文件,点击“上传“按钮,产生BN_CLICKED事件,调用OnUpload函数,该函数获得当前输入的服务器名、登录用户名和口令,禁用用于输入的文本框控件,禁用查询按钮,禁用用于输入的文本框控件,弹出小对话框,获得待上传的本地机文件路径和文件名,调用Upload函数上传文件。上传完毕,激活查询按钮,激活用于输入的文本和编辑控件。Upload函数也重新创建Internet会话,建立FTP连接,上传文件后,然后清除会话对象和连接对象。可见,此程序的查询、下载和上传功能基本是独立的。每次都要创建会话,建立连接,执行操作,然后清除对象。这时为了简单清楚起见而这样做的。此程序的主要的技术要点是:如何创建一个Internet会话,即创建CInternetSession对象;如何建立与FTP服务器的连接,即创建CFtpConnection对象;如果连接成功,如何获得当前登录的目录下的文件和目录名称,即检索一个目录下的文件,并显示文件信息;如何下载文件、上传文件以及关闭连接。6.4.2 创建应用程序的过程1使用MFC AppWizard创建应用程序框架工程名是Ftp,应用程序的类型是基于对话框的,其它部分接受系统的默认设置就可以。应用程序包括两个类:应用程序类:CFtpApp,对应的文件是Ftp.h和Ftp.cpp。对话框类:CFtpDlg,对应的文件是FtpDlg.h和FtpDlg.cpp。2为对话框添加控件在程序的主对话框界面中按照图6-13添加相应的可视控件对象,并按照表6.13修改控件的属性。表6.13 对话框中的控件属性控件类型控件IDCaption静态文本 static textIDC_STATIC_FTP服务器域名静态文本 static textIDC_STATIC_NAME用户登录名静态文本 static textIDC_STATIC_PWD登录口令静态文本 static textIDC_STATIC_FILE目录文件列表编辑框 edit boxIDC_EDIT_FTP编辑框 edit boxIDC_EDIT_NAME编辑框 edit boxIDC_EDIT_PWD命令按钮 buttonIDOK查询命令按钮 buttonIDC_DOWNLOAD下载命令按钮 buttonIDC_UPLOAD上传命令按钮 buttonIDCANCLE退出列表框 listboxIDC_LIST_FILE(sort不选)3定义控件的成员变量按照表6.14,用类向导(Class Wizard)为对话框中的控件对象定义相应的成员变量。表6.14 控件对象的成员变量控件IDControl IDs变量名称Member Variable Name变量类别Category变量类型Variable TypeIDC_STATIC_FTPm_staFtpControlCStaticIDC_STATIC_NAMEm_staNameControlCStaticIDC_STATIC_PWDm_staPwdControlCStaticIDC_EDIT_FTPm_strFtpValueCStringm_editFtpControlCEditIDC_EDIT_NAMEm_strNameValueCStringm_editNameControlCEditIDC_EDIT_PWDm_strPwdValueCStringm_editPwdControlCEditIDOKm_btnQueryControlCBottonIDC_DOWNLOADm_btnDownloadControlCBottonIDC_UPLOADm_btnUploadControlCBottonIDC_LIST_FILEm_listFileControlCListBox4添加成员变量的初始化代码在FtpDlg.cpp文件的OnInitDialog()函数中添加成员变量的初始化代码。对服务器名,登录用户名,登录口令的控件变量赋初值。BOOL CFtpDlg:OnInitDialog(). / 前面是MFC应用程序向导和类向导自动生成的代码/ TODO: Add extra initialization herem_strFtp=_T(); / 初始化服务器域名m_strName=_T(); / 初始化登录用户名m_strPwd=_T(); / 初始化登录口令UpdateData(FALSE); /更新界面return TRUE; / return TRUE unless you set the focus to a control5为对话框中的控件对象添加事件响应函数按照表6.15,用类向导(Class Wizard )为对话框中的控件对象添加事件响应函数。表6.15 对话框控件的事件响应函数控件类型对象标识 ObjectID消息 Message函数Member functions命令按钮IDOKBN_CLICKEDOnQuery命令按钮IDC_DOWNLOADBN_CLICKEDOnDownload命令按钮IDC_UPLOADBN_CLICKEDOnUpload列表框IDC_LIST_FILELBN_SELCHANGEOnSelchangeListFile6为CFtpDlg类添加其它的成员函数BOOL CFtpDlg: Download (CString strSName, CString strDName);BOOL CFtpDlg: Upload (CString strSName, CString strDName);分别用于文件的下载和上传。7手工添加包含语句在CFtpDlg类的FtpDlg.cpp文件中添加对于Afxinet.h的包含命令,来获得对于MFC WinInet类的支持。8添加事件函数和成员函数的代码9进行测试关于测试,有一点必须指出,如果在本机测试,必须在本机安装一个FTP服务器,并将它运行起来,然后才能运行此程序。FTP服务器软件很多,可以从网上下载,例如比较简单的NetFtpd.exe。运行这个例子程序时,在服务器域名文本框中输入“localhost”,保持登录用户名和口令文本框为空,单击“查询”按钮,用户将获得FTP服务器的默认目录下的文件名和目录名。如果在局域网上测试,同样要安装FTP服务器,不过输入的服务器名等信息要根据配置来定。6.4.3 主要功能实现的代码和分析这个程序的类比较少,只需要在CFtpDlg类的FtpDlg.cpp文件中添加事件函数和成员函数的代码。以下按照它们执行的功能分别介绍。1查询并显示FTP服务器的当前目录内容当用户输入了服务器名、登录用户名和口令后,点击查询按钮,会产生BN_CLICKED事件,导致执行对应的函数OnQuery()。代码如下:void CFtpDlg:OnQuery() CInternetSession* pSession; /定义会话对象指针变量CFtpConnection* pConnection; /定义连接对象指针变量CFtpFileFind* pFileFind; /定义文件查询对象指针变量CString strFileName;BOOL bContinue;pConnection=NULL; /初始化pFileFind=NULL;UpdateData(TRUE); / 获得用户的当前输入(服务器名,用户名和口令)while(m_listFile.GetCount()!=0) m_listFile.DeleteString(0); / 清除列表框的内容pSession=new CInternetSession( / 创建Internet会话类对象AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);try / 试图建立与指定FTP服务器的连接pConnection=pSession-GetFtpConnection(m_strFtp,m_strName,m_strPwd); catch (CInternetException* e) e-Delete(); / 无法建立连接,进行错误处理pConnection=NULL;if (pConnection!=NULL)/ 创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针pFileFind=new CFtpFileFind(pConnection);bContinue=pFileFind-FindFile(*); / 查找服务器上当前目录的任意文件if (!bContinue) / 如果一个文件都找不到,结束查找pFileFind-Close();pFileFind=NULL;while (bContinue) / 找到了第一个文件,继续找其它的文件strFileName=pFileFind-GetFileName(); / 获得找到的文件的文件名/ 如果找到的是否目录,将目录名放在括弧中if (pFileFind-IsDirectory() strFileName=+strFileName+;/ 将找到的文件或目录名显示在列表框中。m_listFile.AddString(strFileName);bContinue=pFileFind-FindNextFile(); / 查找下一个文件if (pFileFind!=NULL)pFileFind-Close(); / 结束查询pFileFind=NULL;delete pFileFind; / 删除文件查询对象if (pConnection!=NULL)pConnection-Close();delete pConnection; / 删除FTP连接对象delete pSession; / 删除Internet 会话对象 2实现文件下载功能/查询以后,当用户在列表框中选择了一个文件时,执行此函数。void CFtpDlg:OnSelchangeListFile() / 禁用用来输入的文本框控件m_editFtp.EnableWindow(FALSE); /服务器域名输入文本框m_editName.EnableWindow(FALSE); /登录用户名输入文本框 m_editPwd.EnableWindow(FALSE); /口令输入文本框m_staFtp.EnableWindow(FALSE);m_staName.EnableWindow(FALSE);m_staPwd.EnableWindow(FALSE);/禁用查询和上传按钮m_btnUpload.EnableWindow(FALSE); /上传按钮m_btnQuery.EnableWindow(FALSE); /查询按钮/激活下载按钮m_btnDownload.EnableWindow(TRUE);/当用户点击“下载”按钮时,执行此函数void CFtpDlg:OnDownload() /获得当前输入UpdateData(TRUE);int nSel=m_listFile.GetCurSel();CString strSourceName;/获得用户在列表框中的选择nSel=m_listFile.GetCurSel();m_listFile.GetText(nSel,strSourceName);if (strSourceName.GetAt(0)!= )/选择的是文件CString strDestName;CFileDialog dlg(FALSE,*.*); /定义了一个文件对话框对象变量if (dlg.DoModal()=IDOK) /激活文件对话框/获得下载文件在本地机上存储的路径和名称strDestName=dlg.GetPathName();/调用函数下载文件if (Download (strSourceName,strDestName)AfxMessageBox(下载成功!,MB_OK|MB_ICONINFORMATION);elseAfxMessageBox(下载失败!,MB_OK|MB_ICONSTOP); else AfxMessageBox(请写入文件名!,MB_OK|MB_ICONSTOP); else /选择的是目录AfxMessageBox(不能下载目录!n请重选!,MB_OK|MB_ICONSTOP);/禁用下载按钮m_btnDownload.EnableWindow(FALSE);/激活查询和上传按钮m_btnUpload.EnableWindow(TRUE);m_btnQuery.EnableWindow(TRUE);/激活用来输入的文本和编辑框控件m_editFtp.EnableWindow(TRUE);m_editName.EnableWindow(TRUE);m_editPwd.EnableWindow(TRUE);m_staFtp.EnableWindow(TRUE);m_staName.EnableWindow(TRUE);m_staPwd.EnableWindow(TRUE);/ Download函数由OnDownload函数调用,执行实际的下载任务BOOL CFtpDlg: Download (CString strSName, CString strDName)CInternetSession* pSession; /定义会话对象变量指针CFtpConnection* pConnection; /定义连接对象变量指针pConnection=NULL;/创建Internet会话对象pSession=new CInternetSession( AfxGetAppName(), 1,PRE_CONFIG_INTERNET_ACCESS);try/建立FTP连接pConnection=pSession-GetFtpConnection(m_strFtp,m_strName, m_strPwd);catch (CInternetException* e)/错误处理e-Delete();pConnection=NULL;return FALSE;if (pConnection!=NULL)/下载文件if (!pConnection-GetFile(strSName,strDName)/下载文件错误pConnection-Close();delete pConnection;delete pSession;return FALSE;/清除对象if (pConnection!=NULL)pConnection-Close();delete pConnection;delete pSession;return TRUE;3实现文件上传功能/当用户点击“上传”按钮时,执行此函数void CFtpDlg:OnUpload() /获得当前输入UpdateData(TRUE);/禁用用于输入的文本框控件m_editFtp.EnableWindow(FALSE); /服务器域名输入文本框m_editName.EnableWindow(FALSE); /登录客户名输入文本框m_editPwd.EnableWindow(FALSE); /口令输入文本框m_staFtp.EnableWindow(FALSE);m_staName.EnableWindow(FALSE);m_staPwd.EnableWindow(FALSE);/禁用查询按钮m_btnQuery.EnableWindow(FALSE);CString strSourceName;CString strDestName;CFileDialog dlg(TRUE,*.*); /定义文本对话框对象变量if (dlg.DoModal()=IDOK)/获得待上传的本地机文件路径和文件名strSourceName=dlg.GetPathName();strDestName=dlg.GetFileName();/调用Upload函数上传文件if (Upload (strSourceName,strDestName)AfxMessageBox(上传成功!,MB_OK|MB_ICONINFORMATION);elseAfxMessageBox(上传失败!,MB_OK|MB_ICONSTOP); else /文件选择有错误AfxMessageBox(请选择文件!,MB_OK|MB_ICONSTOP);/激活查询按钮m_btnQuery.EnableWindow(TRUE);/激活用于输入的文本框控件m_editFtp.EnableWindow(TRUE);m_editName.EnableWindow(TRUE);m_editPwd.EnableWindow(TRUE);m_staFtp.EnableWindow(TRUE);m_staName.EnableWindow(TRUE);m_staPwd.EnableWindow(TRUE);/ Upload函数有事件处理函数OnUpload调用,执行实际的上传任务BOOL CFtpDlg: Upload (CString strSName, CString strDName)CInternetSession* pSession;CFtpConnection* pConnection;pConnection=NULL;/创建Internet会话pSession=new CInternetSession(AfxGetAppName(), 1,PRE_CONFIG_INTERNET_ACCESS);try/建立FTP连接pConnection=pSession-GetFtpConnection( m_strFtp,m_strName, m_strPwd);catch (CInternetException* e)/错误处理e-Delete();pConnection=NULL;return FALSE;if (pConnection!=NULL)/上传文件if (!pConnection-PutFile(strSName,strDName)/上传文件错误pConnection-Close();delete pConnection;delete pSession;return FALSE;/清除对象if (pConnection!=NULL)pConnection-Close();delete pConnection;delete pSession;return TRUE;10.6 接收电子邮件的程序实例10.6.1 实例程序的目的和实现的技术要点通过这个实例,读者可以进一步了解POP3的有关原理和内容。程序的用户界面如图10.6所示:图10.6 pop3电子邮件接收程序的用户界面这个实例不太复杂,用户可以利用某个网站的pop3电子邮件接收服务器来接收你在该网站的电子邮箱里的信件。首先填入pop3服务器地址、邮箱用户名和口令,并决定是否要删除邮箱里的邮件;然后点击“连接”按钮,程序会与服务器建立TCP连接,然后发送用户名和口令,经过验证,进入POP3会话。通过命令交互,将邮箱中的所有邮件取回。在此过程中,左下方的多文本列表框(RichTextBox)会显示全部的会话信息。信件全部下载完毕后,左上方的组合列表框中就有了所有信件的标题字段。用户可以从中选择一封信件,查看或者存储。然后可以断开连接。实例只介绍了接收邮件,提取信头标题字段的有关内容,能正确显示符合Rfc822规范的邮件。由于目前邮件结构非常复杂,限于篇幅,程序没有对收到的信件作进一步的分析,也没有对编码的信息进行译码,读者看到的是收信的原始信息,有兴趣的读者可以进一步扩展程序的功能,例如,对信件进行MIME格式分析,将附件提取出来。程序实现的技术要点是:1运用Windows的消息驱动机制除了由MFC创建的应用程序类和对话框类以外,程序从CAsyncSocket类派生了自己的套接字类,并为它添加了OnConnect()、OnClose()和OnReceive()三个事件处理函数。程序的会话过程几乎完全是由FD_READ消息驱动的。建立连接后,服务器会返回信息,接到命令后,服务器也会返回信息。当信息到达客户端套接字的接收缓冲区时,会触发FD_READ消息,并自动执行OnReceive()函数。该函数接收服务器发来的信息,进行分析处理,然后再发送相应的命令。这命令又会引来服务器的响应,又会触发客户端的FD_READ消息。如此周而复始,完成POP会话的全过程。2通过状态转换来控制会话命令的发布顺序程序定义了一个枚举类型STATE,并为套接字类定义了一个STATE类型的变量state,用来表示POP会话的实际状态。容易看出,枚举的成员符号是客户端向POP3服务器发送的命令。typedef enum FIRST=0,USER,PASS,STAT,LIST,RETR,ENDRETR,DELE,GOON STATE;STATE state;当用户点击“连接”按钮与服务器建立TCP连接时,将state置为初值FIRST;然后,每当收到服务器的信息,一方面根据会话的当前状态作响应的分析处理,决定应当继续发送哪条命令,另一方面发出下一个命令以后,改变state的值,将它置为该命令的状态对应的值,这就实现了会话过程中的状态转换,并保证会话按照既定的顺序进行。读者可仔细分析mySock:AnalyzeMsg()函数。3用结构向量来缓存信件信息首先程序定义了一个结构类型,用来缓存一封信件信息。typedef struct CString text; /存储信件的文本int msgSize; /信件的大小int retrSize; /信件实际下载的大小,在下载过程中动态变化 MESSAGEPROP;然后为套接字类定义了一个向量型的成员变量,相当于一个数组,其成员是上述的结构。vector msgs; 在pop会话中,一次性地将信箱中所有信件的信息转入这个向量,然后可以查阅,存储到文件中,或者进行其他处理。10.6.2 创建应用程序的过程1使用MFC AppWizard创建应用程序框架工程名是pop3,应用程序的类型是基于对话框的,对话框的标题是“接收电子邮件客户端程序”,需要Windows Sockets的支持,其它部分接受系统的默认设置就可以。向导自动为应用程序创建了两个类:应用程序类:CPop3App,基类是CWinApp,对应的文件是pop3.h和pop3.cpp。对话框类:CPop3Dlg,基类是CDialog,对应的文件是pop3Dlg.h和pop3Dlg.cpp。2为对话框添加控件在程序的主对话框界面中按照图10.6添加相应的可视控件对象,并按照表10.6修改控件的属性。表10.6 对话框中的控件属性控件类型控件IDCaption静态文本 static textIDC_STATICpop3服务器地址静态文本 static textIDC_STATIC用户名静态文本 static textIDC_STATIC口令编辑框 edit boxIDC_EDIT_SERVER编辑框 edit boxIDC_EDIT_USER编辑框 edit boxIDC_EDIT_PASS复选框 Check BoxIDC_CHECK_DEL删除邮箱中的邮件多文本框 RichEdit BoxIDC_RICH_INFO组合选择框ComboBoxIDC_COMB_LIST(Drop List型)命令按钮 buttonIDC_BTN_CONN连接命令按钮 buttonIDC_BTN_DISC断开命令按钮 buttonIDCANCAL取消命令按钮 buttonIDC_BTN_VIEW查看邮件命令按钮 buttonIDC_BTN_SAVE存 储3定义控件的成员变量按照表10.7,用类向导(Class Wizard)为对话框中的控件对象定义相应的成员变量。表10.7 控件对象的成员变量控件IDControl IDs变量名称Member Variable Name变量类别Category变量类型Variable TypeIDC_EDIT_SERVERm_strServerValueCStringIDC_EDIT_USERm_strUserValueCStringIDC_EDIT_PASSm_strPassValueCStringIDC_CHECK_DELm_bolDelValueBOOLIDC_COMB_LISTm_ctrListControlCComboBoxIDC_RICH_INFOm_InfoValueCStringm_ctrlnfoControlCRichEditCtrl4为对话框中的控件对象添加事件响应函数按照表10.8,用类向导(Class Wizard )为对话框中的控件对象添加事件响应函数。表10.8 对话框控件的事件响应函数控件类型对象标识 ObjectID消息 Message函数Member functions命令按钮IDC_BTN_CONNBN_CLICKEDOnBtnConn命令按钮IDC_BTN_DISCBN_CLICKEDOnBtnDisc命令按钮IDC_BTN_VIEWBN_CLICKEDOnBtnView命令按钮IDC_BTN_SAVEBN_CLICKEDOnBtnSave5为Cpop3Dlg类添加其它的成员void Disp(LONG flag); /在不同的会话阶段显示不同的信息mySock pop3Socket; /套接字类对象实例6创建从CAsyncSocket类继承的派生类为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。Class Type选择MFC Class,类名为mySock,基类是CAsyncSocket类,创建后对应的文件是mysock.h和mysock.cpp。在利用类向导为mysock类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。可参看下一小节的程序代码。7手工添加包含语句以及事件函数和成员函数的代码8分阶段编译执行,进行测试10.6.3 程序清单1CPop3App应用程序类对应的文件pop3.h不动,在pop3.cpp的InitInstance()函数中添加一句初始化多文本框控件的函数。BOOL CPop3App:InitInstance()if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer(); /MFC自动创建的代码AfxInitRichEdit(); /用户添加的.2CPop3Dlg对话框类对应的文件(1)pop3Dlg.h包含文件.#include mySock.h /添加套接字类的包含文件.class CPop3Dlg : public CDialog/ Constructionpublic:void Disp(LONG flag); /在不同的会话阶段显示不同的信息mySock pop3Socket; /套接字类对象实例CPop3Dlg(CWnd* pParent = NULL); / standard constructor.(2)pop3Dlg.cpp实现文件#include stdafx.h#include pop3.h#include pop3Dlg.h#include mySock.h /手工添加的包含语句.BOOL CPop3Dlg:OnInitDialog()./ TODO: Add extra initialization here/用户在这里添加控件成员变量的初始化代码m_strServer = _T(); /POP3服务器地址m_strUser = _T(example); /邮箱的用户名m_strPass = _T(123456); /口令m_bolDel = FALSE; /下载邮件后不删除m_Info = _T(); /多文本框清空return TRUE; / return TRUE unless you set the focus to a control./以下是事件处理函数和其他成员函数的代码/当用户点击连接按钮时,执行此函数void CPop3Dlg:OnBtnConn() /设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息pop3Socket.SetParent(this); UpdateData(TRUE); /取来用户在对话框中输入的数据pop3Socket.Create(); /创建套接字对象的底层套接字pop3Socket.Connect(LPCSTR)m_strServer,110); /连接pop3服务器m_Info = ; /多文本列表框清空UpdateData(FALSE); /更新用户界面/当用户点击断开按钮时,执行此函数void CPop3Dlg:OnBtnDisc() pop3Socket.Close();/当用户点击查看邮件按钮时,执行此函数void CPop3Dlg:OnBtnView() int i;i = m_ctrList.GetCurSel(); /获得用户在组合框中的选择/获得并显示指定信件的基本属性及信件内容m_Info += pop3Socket.GetMsgStuff(i);m_Info += pop3Socket.GetMsgBody(i);/在不同的情况下,向用户显示不同的信息void CPop3Dlg:Disp(LONG flag)CString s;switch(flag)case S_CONNECT: /已连接到服务器,显示信息s = 已连接到+m_strServer+.rn;m_Info+=s;/禁用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(FALSE);/启用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(TRUE);/禁用查看邮件按钮GetDlgItem(IDC_BTN_VIEW)-EnableWindow(FALSE);break;case S_RECEIVE:/收到服务器发来的响应,显示它的内容m_Info+=pop3Socket.lastMsg;break; case S_CLOSE: /显示关闭连接的信息m_Info+=pop3Socket.error;s = 连接已经关闭rn;m_Info+=s; /启用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(TRUE);/禁用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(FALSE); break;case S_GETNUM: /已经知道了邮箱中信件的总数s.Format(邮箱中共有 %d 封信rn,pop3Socket.numMsg);m_Info+=s;break;case S_GETSIZE: /显示信件的大小s.Format(信箱中信件大小为:%d字节rn,pop3Socket.sizeMsg);m_Info+=s; break;case S_ENDRETR: /所有信件已下载完毕,显示信息s.Format(共下载了 %d 封信件rn,pop3Socket.msgs.size();m_Info+=s;/如果有信件下载,启用查看邮件按钮if(pop3Socket.msgs.size()0)GetDlgItem(IDC_BTN_VIEW)-EnableWindow(TRUE);break;UpdateData(FALSE); /更新用户界面/当点击“存储”按钮时,执行此函数。void CPop3Dlg:OnBtnSave() int i;CString s;i = m_ctrList.GetCurSel();/获得指定信件的基本属性及信件内容s = pop3Socket.GetMsgStuff(i);s += pop3Socket.GetMsgBody(i);CFileDialog dlg(FALSE);if(dlg.DoModal()=IDOK)CFile file(dlg.GetPathName(),CFile:modeCreate | CFile:modeWrite | CFile:typeBinary);file.Write(LPCSTR)s,s.GetLength();file.Close();3mySock套接字类对应的文件(1)mysock.h包含文件.#include #include #include using namespace std;class CPop3Dlg;/显示不同信息的标志#define S_CLOSE 1 /当关闭连接时,显示关闭信息#define S_CONNECT 2 /当连接成功时,显示连接信息#define S_RECEIVE 3 /当收到服务器发来的信息时,显示该信息#define S_GETNUM 4 /当所有信件下载完毕后,显示信箱中的信件总数#define S_GETSIZE 5 /当所有信件下载完毕后,显示信箱中的信件总大小#define S_ENDRETR 6 /当所有信件下载完毕后,显示相关信息/描述pop3会话状态的枚举类型typedef enum FIRST=0,USER,PASS,STAT,LIST,RETR,ENDRETR,DELE,GOON STATE;/用来缓存一封信件信息的结构typedef struct CString text; /存储信件的文本int msgSize; /信件的大小int retrSize; /信件实际下载的大小,在下载过程中动态变化 MESSAGEPROP;/自己的套接字类class mySock : public CAsyncSocket/ Attributespublic:CString lastMsg;CString error;int numMsg, sizeMsg, retrMsg;vector msgs; /盛放信件信息的向量/ Opera
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《小学教师招聘》综合提升试卷含答案详解(培优a卷)
- 国际节水农业示范合作创新创业项目商业计划书
- 动物源性食品新产品创新创业项目商业计划书
- 演出经纪人之《演出经纪实务》综合练习及答案详解(网校专用)
- 押题宝典教师招聘之《幼儿教师招聘》试题及答案详解(夺冠)
- 教师招聘之《幼儿教师招聘》考试黑钻押题附答案详解【考试直接用】
- 2025内蒙古呼伦贝尔选聘政务服务社会监督员9人笔试备考附答案详解(考试直接用)
- 2025年教师招聘之《幼儿教师招聘》题库必背100题附答案详解(突破训练)
- 2025年教师招聘之《小学教师招聘》能力检测试卷及答案详解【全优】
- 2025年教师招聘之《幼儿教师招聘》押题练习试卷及参考答案详解(巩固)
- 工程竣工移交单(移交甲方、物业)
- 冠心病的介入治疗与手术治疗适应症
- 新能源装备制造业行业研究报告
- 家博会现场抽奖活动方案
- 芦苇创意美术课件
- 古建筑保护和修复工程项目可行性研究报告
- 2025鲁迅美术学院教师招聘考试试题
- 湖北省枣阳市实验中学2025届七年级英语第二学期期末考试试题含答案
- 公司行政综合部管理制度
- 餐厅迎宾培训内容
- 《中国古代的法治与教化》部优课件1
评论
0/150
提交评论