当前位置:文档之家› 北邮程序设计实验报告

北邮程序设计实验报告

程序设计实践设计报告课题名称:邮件客户端学生姓名:班级:2班内序号:16学号:2日期:2014.6.41.课题概述1.1课题目标和主要内容本课题主要通过MFC的方式,利用SOCKET以及SMTP相关知识,来实现邮件(可携带附件)的定向发送,借此来复习和巩固C++编程的基本思想;学习SOCKET以及SMTP的相关知识,了解复杂网络应用程序的设计方法,并独立完成一个网络应用。

1.2系统的主要功能1.邮件的发送(不携带附件)2.邮件的发送(携带附件)3.邮件接收2. 系统设计2.1 系统总体框架程序的功能由MyEmailClientDlg.cpp,SMTP.cpp,MailMessage.cpp,Base64.cpp, MIMECode.cpp,MIMEContentAgent.cpp,MIMEMessage.cpp,AppOctetStream.cpp, MyEmailClient.cpp,StdAfx.cpp,TextPlain.cpp来实现。

其中MIMECode.cpp, MIMEContentAgent.cpp,MIMEMessage.cpp, AppOctetStream.cpp, TextPlain.cpp来对MIME 协议进行封装,Base64.cpp来对Base64编码进行封装,SMTP.cpp是对SMTP协议进行封装,MailMessage.cpp是利用MIME协议对邮件内容的一个处理,最终通过MyEmailClientDlg.cpp 来实现邮件的发送的功能。

2.2 系统详细设计[1] 模块划分图及描述协议模块:包括网络应用程序中的各种协议,包括STMP协议,MIME协议等。

处理模块:主要实现对数据的进行编码以及解码。

实现模块:主要内容为邮件发送的具体步骤,相关按钮操作。

[2] 类关系图及描述协议类:CSMTP, CTEXTPlai, CMIMECode,C MIMEContentAgent,C MIMEMessage, CAppOctetStream, CTextPlain.主要为协议中信息处理的中作用编码类:Base64, MailMessage.主要为对邮件信息的处理实现类:CAboutDlg,CMyEmailClientApp,CMyEmailClientDlg.主要为MFC的框架构建以及邮件发送的实现。

[3] 程序流程图及描述[4] 存储结构、内存分配主要使用字符串数组来进行存储,同时还是用套接字来进行消息传输。

2.3 关键算法分析算法1:BOOL CSMTP::Connect()[1] 通过SMTP协议内容的判断对服务器之间的连接状况的判断[2] 将SMTP的协议工作原理进行细化,分为1.TCP连接。

2.客户端发送HELO命令。

3.客户端发送AUTH LOGIN命令。

4.用户名与密码的验证。

分别在每一个步骤后对服务器返回的消息进行分析,判断是否连接正常。

[3] 由于没有其他参量,时间复杂度为O(1)。

空间复杂度为O(1)。

[4]1判断套接字是否创建成功。

2判断是否连接到服务器。

3判断服务器是否响应。

4发送HELO命令,同时判断服务器响应是否正确。

5发送AUTH LOGIN命令,同时判断服务器响应是否正确。

6发送经过Base64编码过后的用户名,同时判断服务器响应是否正确。

7发送经过Base64编码过后的密码,同时判断服务器响应是否正确。

8一切正常,将变量m_bConnected=TRUE。

算法2:BOOL CSMTP::transmit_message(CMailMessage * msg)[1] 向服务器发送邮件[2] 根据SMTP发送邮件的工作原理,将其分为1.发送MAIL命令,告知服务器发件人的邮件地址。

2.发送RCPT命令,告知服务器的接收人的邮件地址。

3.发送DATA命令。

4.发送邮件内容。

5.发送结束符,结束此次发送。

[3] 由于FOR循环中包含msg->GetNumRecipients(),所以时间复杂度为O(n)。

空间复杂度为O(1)。

[4] 1.判断是否连接服务器正常。

2.发送MAIL指令及发件人信息,并判断服务器响应。

3.发送RCPT指令及收件人信息,多个收件人必须多次发送,最后判断服务器响应。

4. 发送DATA指令,并判断服务器响应。

5.发送邮件内容。

6.发送结束符,结束此次发送,并判断服务器响应。

算法3:BOOL CSMTP::get_response( UINT response_expected )[1] 根据服务器的响应来判断是否正常[2] 首先判断套接字是否接收成功,然后将得到的响应进行分析,判断结果[3] 时间复杂度为O(1),空间复杂度为O(1)[4] 1.判断是否接收套接字正常,不正常直接返回FALSE。

2.判断接收的套接字是否为预期的,正常直接返回TRUE。

3.对接收的服务器响应,进行判断。

如果错误,将错误原因赋值给m_sError。

算法4:void CMyEmailClientDlg::OnButtonAddFile()[1] 附件按钮响应,实现添加附件的功能[2] 从目录中选择的文件,一个一个显示到附件的列表框中。

[3] 由于和选择的附件数目有关,所以时间复杂度为O(n)。

空间复杂度为O(1)。

[4] 1.显示打开文件对话框。

2.将选择的文件写入pos变量中。

3.将pos中文件路径用字符串的方式显示到列表框中。

算法5:void CMyEmailClientDlg::OnSend()[1] 发送按钮响应,实现发送邮件的功能[2] 将填入界面中的信息分别赋予其对应变量,然后按照顺序调用对应的功能函数,实现邮件的发送。

[3] 由于收件人以及附件的数目不确定性,其时间复杂度为O(nm)。

空间复杂度为O(1)。

[4] 1.将填入的相应信息分别赋值给CMIMEMessage msg对象。

2.根据列表框中的附件字符串数目,然后根据MIME协议进行添加附件。

3.建立CSMTP对象,同时设置m_SMTP 的对应属性。

4.连接SMTP服务器,并判断是否成功。

5.发送邮件,并判断是否成功。

6.清空附件框,并断开SMTP服务器的连接。

2.4 其他直接使用了封装好的MIME协议,大大增强了代码的简洁性。

3.程序运行结果分析包括输入数据来源和格式、输出显示方式、主要界面、操作流程、响应时间,运行效果等。

输入数据来源和格式:1.键盘输入。

直接从键盘输入相应的信息,如用户名,发件人等信息。

格式一般为字符串2.鼠标输入。

利用鼠标从电脑选择附件,进行输入。

在列表框中显示的格式为字符串。

输出显示方式:主要为对话框直接显示消息。

主要界面:只包含一个主界面,点击附件按钮后,会弹出打开文件对话框。

操作流程:按照要求输入用户名(选择163或126邮箱,QQ邮箱使用前需要在邮箱中设置),密码。

然后输入发送邮件的发件人,收件人,标题,内容,可以选择附件。

最后点击发信即可。

退出时,可以点击退出。

运行效果:4.总结4.1课题的难点和关键点本次课题相对上次的课题难度加大不少,特别是要运用MFC进行编程,在之前我只是在控制台上学习编程。

此外,本次课题的难点在于网络应用程序的设计是老师上课时并未仔细说明,主要靠同学自己自学。

其中包括SMTP协议,MIME协议,以及Base64编码都是新的知识,虽然这几个文件的代码网上有,但是要自己学会使用。

在网络传输中,通过课本明白了套接字的作用及使用,让我对SMTP的协议有了更加深刻的理解。

关键点在于使用套接字与服务器进行交互,与服务器之间发送消息,并借此发送消息。

根据SMTP协议的工作原理,将每一步都使用套接字进行发送,并进行判断,成功的实现了与服务器之间的交互。

4.2本课题的评价对于本次课题,算是这个学期以来碰到的最难得实验。

特别是mfc的知识事先没有接触过,不得不通过查阅课外书籍,以及加上百度的力量。

本次课题十分经典,但因为涉及与网络编程,使编程的难度大大增加。

不仅考验我们对旧知识的重新运用,也考察了我们对新知识的学习与理解。

能够充分培养学生的合作意识,培养学生发现问题,解决问题的能力,充分发挥学生的想象力、创造力,激发学生主动学习的潜能。

在程序运行的时,存在很多警告,自己不能够充分解决。

主要是由于VS程序的升级,使得以前使用的函数存在危险。

但是由于知识水平的有限,在知道了改进的函数之后,仍然没有办法解决这个警告。

同时自己对于MIME协议理解的仍然不够深刻,无法彻底剖析以及独立完成。

以后,我会更加努力的学习网络知识,争取解决这么问题。

4.3心得体会本次试验可谓是折磨人,特别是在一大波期末考试来临之前要求完成。

可喜的是在查阅资料和借助他人一些代码的情况下,程序总算可以运行出来。

通过这次MFC的编程,让我又学会了一种新的编译办法。

相比之下,觉得MFC界面比控制台界面更加人性化。

在学习编程过程中,慢慢意识到编程的奥妙,特别是层与层之间的相互关系。

如果学会正确处理这些关系,那编程就会简单很多,这个心得也会影响到以后各科的学习,甚至是终生有益。

5. 参考文献[1]徐惠民等,C++高级语言程序设计案例与实践辅导,北京:人民邮电出版社,2012[2]徐雅静等,数据结构与stl,北京:北京邮电大学,2011[3]徐惠名等,C++高级语言程序设计,北京,人民邮电出版社,2012。

相关主题