




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 14 SMTP 邮件服务器实验 1 实验内容和实验环境描述 实验任务 使用 Socket API 编写一个 SMTP 邮件服务器程序 实验内容 1 作为 SMTP 服务器 接收邮件客户端程序的 TCP 连接请求 接收 SMTP 命令和邮件数据 将 邮件保存在文件中 2 作为 SMTP 客户端 建立到实际邮件服务器的 TCP 连接 发送 SMTP 命令 将保存的邮件发送 给实际邮件服务器 3 提供邮件差错报告 将实际邮件服务器的差错报告转发给邮件客户端软件 4 支持一封邮件多个接收者 要求接收者属于不同的域 如 5 提供发件人和收件人 Email 地址格式检查功能 例如下列邮件地址是错误的 chengli chengli 实验环境 Microsoft Visual Studio 2010 2 软件设计 1 数据结构 char mail from 4096 存发件地址 char rcpt to 5 4096 存收件地址 char data 4096 存Data char imf 4096 存邮件标准格式 WORD A 加载套接字库 WSADATA B 储存调用WSAStartup函数返回的Windows Sockets初始化信息 int err 报错标志 SOCKET sockSrv 创建用于监听客户端的套接字 SOCKADDR IN addrSrv 作为服务器端的socket地址 char recvBuf 4096 接收客户端SMTP指令 2 模块结构 1 main 服务器端 用于从客户端接收储存邮件 2 main clicenet SOCKET s 客户端 用于将收到的邮件转发到邮件服务器 同时将邮件服务器的 错误报告通过SOCKET s转发给客户端 3 ValidEmail char addr 收发件地址 addr 合法性监测 2 14 3 算法流程 画出流程图 描述算法的主要流程 Main Load Windows Sockets 创建用于监听的 socket 绑定 socket 和 sockaddr 将 socket 设为监听模式 While 1 请求队列非空则抽取第一个链接建立连接 打开邮件储存文件 Send 220 recv EHLO Send 250 OK recv MAIL FROM T 发 件 地址 合 法 F Send 550 Invalid User continue Send 250 OK recv RCPT TO 检查合法性 While recv DATA recv RCPT TO 检查合法性 Send 250 OK Recv DATA send 354 Start mail input end with r n recv DATA fragment bytes Send 250 recv IMF send 250 recv Send QUIT 调用客户端程序 关闭套接字 关闭文件指针 释放分配的套接字资源 4 主要功能模块的实现要点 1 main 服务器端 用于从客户端接收储存邮件 实现要点 与客户端建立连接 根据SMTP协议标准进行通信 2 main clicenet SOCKET s 客户端 用于将收到的邮件转发到邮件服务器 同时将邮件服务器的 错误报告通过SOCKET s转发给客户端 实现要点 与服务器端建立连接 根据SMTP协议标准进行通信 3 ValidEmail char addr 收发件地址 addr 合法性监测 实现要点 根据标准email地址格式进行合法性监测 3 实验结果演示及分析 1 对于你所实现的功能 逐个进行测试 并将输出截图 3 14 普通邮件群发 1 2 3 4 14 4 错误报告 1 2 2 你的程序是否提供了差错处理功能 可以对哪些差错进行处理 5 14 1 将实际邮件服务器的差错报告转发给邮件客户端软件 2 监测收发件邮箱地址格式是否正确 3 和课堂上学习的 SMTP 协议相比 你的程序是否完全按照协议来实现 是否有不同之处 和实际的 SMTP 服务器相比 你的程序有哪些优点和不足 不是 因为 main 函数无法从客户端收取用户名和密码 故跳过 AUTH LOGIN 部分 直接开始 MAILFROM 优点 代码功能较为简洁易懂 不足 未实现用户合法性监测 以及收发件邮箱地址是否实际存在 4 实验总结和心得体会 描述你在调试过程中都遇到了哪些问题和解决的过程 1 完成本次实验的实际上机调试时间是多少 14hours 2 编程工具方面遇到了哪些问题 包括 Windows 环境和 VC 软件的安装问题 没 3 编程语言方面遇到了哪些问题 包括 C 语言使用和对 C 语言操控能力上的问题 涉及到 Socket 方面的函数由于初次接触使用尚不熟练 4 协议方面遇到了哪些问题 包括协议机制的设计错误 发现协议死锁 或者不能正确工作 协议参数的调 整等问题 协议中提供的邮件域名解析指令被大部分邮件服务器屏蔽 只能通过其他函数编码实现相应功能 5 通过本次试验 你认为 SMTP 协议有哪些不足 有何改进思路 功能较为基础 但扩展改进等已有 SSL X2 5 等增强版本存在 6 总结本次实验 你在 C 语言方面 协议软件方面 理论学习方面 软件工程方面等哪些方面上有所提高 熟悉了 C 语言的编码规范 通信协议的工作机制 5 源程序清单 pragma comment lib wsock32 lib include include include include char mail from 4096 6 14 char rcpt to 5 4096 char data 4096 char imf 4096 void main Client SOCKET int ValidEmail char void main WORD A MAKEWORD 1 1 加载套接字库 WSADATA B 储存调用 WSAStartup 函数返回的 Windows Sockets 初始化信息 int err err WSAStartup A 根据 A 要求的版本初始化 Winsock 服务 if err 0 Tell the user that we couldn t find a useable winsock dll return if LOBYTE B wVersion 1 HIBYTE B wVersion 1 WSACleanup 检查 socket 版本 不符合则释放分配资源return SOCKET sockSrv socket AF INET SOCK STREAM 0 创建用于监听客户端的套接字 SOCKADDR IN addrSrv 作为服务器端的 socket 地址 addrSrv sin addr S un S addr inet addr 127 0 0 1 Internet address addrSrv sin family AF INET addrSrv sin port htons 25 服务器端端口号 bind sockSrv SOCKADDR 绑定套接字 listen sockSrv 5 将套接字设为监听模式 准备接受客户请求 SOCKADDR IN addrClient 客户端地址 int len sizeof SOCKADDR 7 14 char sendBuf 220 LX s SMTP Ready r n 250 LX s server 250 mail 250 PIPELINING r n 250 OK r n 250 OK r n 354 Start mail input end with r n 250 OK r n 250 OK r n QUIT r n 550 Invalid User r n 发送标示符 char tempbuf1 4096 while 1 等待客户请求 SOCKET sockConn accept sockSrv SOCKADDR 队列非空则 sockSrv 抽取第 一个链接 否则阻塞调用进程 FILE fp fp fopen d University mail txt w char recvBuf 4096 接收客户端 SMTP 指令 memset rcpt to 0 sizeof rcpt to send sockConn sendBuf 0 strlen sendBuf 0 0 向已经连接的套接字 sockConn 发送连接建立信 息 220 recv sockConn recvBuf sizeof recvBuf 0 接收数据 EHLO acer PC fprintf fp s n recvBuf 将数据写入文件 memset recvBuf 0 sizeof recvBuf 将 recvBuf 前 4096 个字节用字符 0 替换 send sockConn sendBuf 1 strlen sendBuf 1 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv MAIL FROM if ValidEmail recvBuf send sockConn sendBuf 8 strlen sendBuf 8 0 closesocket sockConn fclose fp continue send 550 memcpy mail from recvBuf sizeof recvBuf 8 14 fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 2 strlen sendBuf 2 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv RCPT TO if ValidEmail recvBuf send sockConn sendBuf 8 strlen sendBuf 8 0 closesocket sockConn fclose fp continue send 550 memcpy rcpt to 0 recvBuf sizeof recvBuf fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 2 strlen sendBuf 2 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv int i 1 strncpy tempbuf1 recvBuf 4 while strcmp tempbuf1 RCPT 0 closesocket sockConn fclose fp continue send 550 memcpy rcpt to i recvBuf sizeof recvBuf fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 2 strlen sendBuf 2 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv RCPT TO strncpy tempbuf1 recvBuf 4 i fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 4 strlen sendBuf 4 0 send 354 Start mail input end with r n recv sockConn recvBuf sizeof recvBuf 0 recv DATA fragment bytes memcpy data recvBuf sizeof recvBuf fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf 9 14 send sockConn sendBuf 5 strlen sendBuf 5 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv IMF memcpy imf recvBuf sizeof recvBuf fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 6 strlen sendBuf 6 0 send 250 OK recv sockConn recvBuf sizeof recvBuf 0 recv fprintf fp s n recvBuf memset recvBuf 0 sizeof recvBuf send sockConn sendBuf 7 strlen sendBuf 7 0 send QUIT fprintf fp s n recvBuf main Client sockConn 调用客户端函数 closesocket sockConn 关闭套接字 fclose fp 关闭文件指针 WSACleanup 释放分配资源 void main Client SOCKET sockCo WORD A MAKEWORD 1 1 WSADATA B int err err WSAStartup A if err 0 return if LOBYTE B wVersion 1 HIBYTE B wVersion 1 WSACleanup return 10 14 SOCKET sockClient socket AF INET SOCK STREAM 0 SOCKADDR IN addrClient addrClient sin family AF INET addrClient sin port htons 25 struct hostent host 主机信息 host gethostbyname memcpy 将获取的主机 IP 地址复制到客户端网络地址 32 位无符号 IPV4 地址 connect sockClient SOCKADDR 连接套接字 char SendBuf EHLO r n AUTH LOGIN r n Z3VhaWRhbzIy r n 邮箱名的 Base64 编码 THVuYVhUSjkyMTAxNA r n 密码的 Base64 编码 DATA r n r n r n QUIT char arecvBuf 4096 char tempbuf 3 memset tempbuf 0 sizeof tempbuf memset arecvBuf 0 sizeof arecvBuf 初始化 arecvBuf recv sockClient arecvBuf sizeof arecvBuf 0 recv 220 OK memset arecvBuf 0 sizeof arecvBuf send sockClient SendBuf 0 strlen SendBuf 0 0 send EHLO acer PC recv sockClient arecvBuf sizeof arecvBuf 0 recv 250 OK strncpy tempbuf arecvBuf 3 if strcmp tempbuf 250 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof arecvBuf 11 14 send sockClient SendBuf 1 strlen SendBuf 1 0 send AUTH LOGIN recv sockClient arecvBuf sizeof arecvBuf 0 recv 334 strncpy tempbuf arecvBuf 3 if strcmp tempbuf 334 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof arecvBuf send sockClient SendBuf 2 strlen SendBuf 2 0 send Z3VhaWRhbzIy recv sockClient arecvBuf sizeof arecvBuf 0 recv 334 strncpy tempbuf arecvBuf 3 if strcmp tempbuf 334 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof arecvBuf send sockClient SendBuf 3 strlen SendBuf 3 0 send THVuYVhUSjkyMTAxNA recv sockClient arecvBuf sizeof arecvBuf 0 rec 235 strncpy tempbuf arecvBuf 3 if strcmp tempbuf 235 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof arecvBuf send sockClient mail from strlen mail from 0 send MAIL FROM recv sockClient arecvBuf sizeof arecvBuf 0 recv 250 OK strncpy tempbuf arecvBuf 3 if strcmp tempbuf 250 0 send sockCo arecvBuf strlen arecvBuf 0 int i 0 while rcpt to i 0 0 send sockClient rcpt to i strlen rcpt to i 0 send RCPT TO recv sockClient arecvBuf sizeof arecvBuf 0 recv 250 OK strncpy tempbuf arecvBuf 3 if strcmp tempbuf 250 0 send sockCo arecvBuf strlen arecvBuf 0 i memset arecvBuf 0 sizeof arecvBuf 12 14 send sockClient SendBuf 4 strlen SendBuf 4 0 send DATA recv sockClient arecvBuf sizeof arecvBuf 0 recv 354 strncpy tempbuf arecvBuf 3 if strcmp tempbuf 354 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof arecvBuf send sockClient data strlen data 0 send DATA fragment bytes memset arecvBuf 0 sizeof arecvBuf send sockClient imf strlen imf 0 send imf fragment memset arecvBuf 0 sizeof arecvBuf send sockClient SendBuf 5 strlen SendBuf 5 0 send recv sockClient arecvBuf sizeof arecvBuf 0 recv 250 OK strncpy tempbuf arecvBuf 3 if strcmp tempbuf 250 0 send sockCo arecvBuf strlen arecvBuf 0 memset arecvBuf 0 sizeof
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新闻从业资格考试试题及答案
- 2025年行政职业能力测验试题及答案
- 2025年物联网技术与应用基础考题及答案
- 2025年物业经理职业考试复习试卷及答案
- Resorthiomycin-生命科学试剂-MCE
- Desthiobiotin-PEG3-NHS-ester-生命科学试剂-MCE
- 2025年绿色建筑设计考试试卷及答案
- 2025年教师资格证测试试题及答案
- 2025年景观设计师考试试卷及答案解析
- 2025年计算机模拟与设计考试试卷及答案
- 彩钢板屋面维修施工方案
- 兰州大学《中国经济史》2023-2024学年第二学期期末试卷
- 青岛版(2024)小学科学一年级下册《木头》说课稿及反思
- 课件:《马克思主义基本原理概论》(23版):第七章 共产主义崇高理想及其最终实现
- 网络空间中的群体行为分析-深度研究
- 间歇性胃管插管护理
- 统计业务培训
- 2025-2030年中国水利工程勘察设计市场运营状况与发展潜力分析报告
- 海康智慧工地解决方案
- 小学科学新教科版一年级下册全册教案(共13课)(2025春详细版)
- 自发性气胸PBL护理教学查房
评论
0/150
提交评论