计算机网络课程设计报告利用C++实现SMTP协议系 别电子信息系专业名称计算机科学与技术班级学号学生姓名指导教师成 绩2011年 7月 12日第 1 页 东北大学秦皇岛分校课程设计 利用C++实现SMTP协议1.概述SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。
1.1设计题目及实现目标设计题目:利用C++实现SMTP协议;实现目标:实现SMTP协议的基本功能,包括客户机的命令与数据1.2开发环境简介 本次开发用Visual C++ 6.0作为开发环境 VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言.但是,vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说 VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。
VC++应用程序的开发主要有两种模式2.系统设计分析2.1 协议分析SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持 SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继”通常, 一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输 SMTP协议工作原理 SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另一个服务器SMTP也是个请求/响应协议,命令和响应都是基于ASCⅡ文本,并以CR和LF符结束响应包括一个表示返回状态的三位数字代码SMTP在TCP协议25号端口监听连续请求 连接和发送过程如下: (1)建立TCP 连接 (2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收 (3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
(4)协商结束,发送邮件,用命令DATA发送 (5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出3.程序核心代码3.1服务器端相关代码:1)、相关核心代码如下:// SMTPSeverDlg.cpp : implementation file#include "stdafx.h"#include "SMTPSever.h"#include "SMTPSeverDlg.h"#include "Picture.h"#include // CSMTPSeverDlg message handlersBOOL CSMTPSeverDlg::OnInitDialog(){ CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here IsDataContent = FALSE ; IsShow = FALSE ; m_Listener.SetParent(this); m_Server.SetParent(this); return TRUE; // return TRUE unless you set the focus to a control}void CSMTPSeverDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); }}void CSMTPSeverDlg::OnAccept(){ CString str; str.Format("*** 收到连接请求"); m_List_Smtp.InsertString(-1,str); if(m_Listener.Accept(m_Server)) { str.Format("*** 建立连接"); m_List_Smtp.InsertString(-1,str); str = _T("220 Simple Mail Sever Ready for Mail\r\n"); m_Server.Send((LPCTSTR)str,str.GetLength()); str = _T("S: ")+str; m_List_Smtp.InsertString(-1,str); m_Server.AsyncSelect(FD_READ); } else m_Server.Close();}void CSMTPSeverDlg::OnReceive(){ char buff[65536]; char local_host[80]; int nRead; memset(buff,0,65536);//清空缓冲区接收数据 nRead = m_Server.Receive(buff, 65536); //根据读到的长度 switch (nRead) { case 0: m_Server.Close(); break; case SOCKET_ERROR: if (GetLastError() != WSAEWOULDBLOCK) { AfxMessageBox ("Error occurred"); m_Server.Close(); } break; default: buff[nRead] =0; //terminate the string CString szTemp; if(IsDataContent) { while(strstr(buff,"\r\n.\r\n")==NULL) { str+=buff; memset(buff,0,65536); nRead = m_Server.Receive(buff, 65536); } str+=buff; CString Temp ; Temp.Format("%s\r\n\r\n",(LPCTSTR)str.c_str()); m_Edit_Con.SetWindowText(Temp); Base64_decode(Temp); szTemp = _T("250 Message accepted for delivery\r\n"); m_Server.Send(szTemp,szTemp.GetLength()); szTemp = _T("S: ")+szTemp; m_List_Smtp.InsertString(-1,szTemp); szTemp.Empty(); IsDataContent=FALSE; } if(strnicmp(buff,"HELO",4)==0) { szTemp = buff; szTemp = _T("C: ")+szTemp; //m_List_Smtp.InsertString(-1,(LPCTSTR)buff); m_List。