基于 WinSock 的邮件系统
description
Transcript of 基于 WinSock 的邮件系统
![Page 1: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/1.jpg)
基于 WinSock 的邮件系统1 设计目标 :
1.1 SMTP 发送邮件服务器 (c 语言 )1.2 POP3 接受邮件服务器 (c 语言 )
1.3 php WebMail 客户端
![Page 2: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/2.jpg)
2 相关技术介绍 :
2.1 TCP/IP协议 2.1.1 发展至今最成功的通信协议,它源于 20 世纪 60年代末美国政府资助的一个分组交换网络研究项目,到20 世纪 90 年代已经发展成为计算机之间最常用的组网协议。它允许分布在各地的装着完全不同的系统的计算机互相通信。它是一个真正的开放系统,该协议的定义及多中实现可以通过多途径无偿得到。随着 pc 的普及,tcp/ip 以其开放的特点,成为了 internet 的基础,该广域网 (WAN) 把全世界数以百万的电脑连接在了一起。
2.1.2 TCP/IP 结构 , 如下图 :
![Page 3: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/3.jpg)
各种应用层协议
TCP UDP
IP
设备驱动程序及接口卡
应用层
传输层网络层链路层
2.1.3 各层功能概述 :
(1) 链路层:有时被称作数据链路层或网络接口层,通 常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆 ( 或其他任何传输媒介 )的物理接口细节。该层包含的协议有 :ARP( 地址转换协议 ) 和 RARP( 反向地址转换协议 ).
![Page 4: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/4.jpg)
(2) 网络层:有时又被称为互连网层,负责分组在网络中的活动,包括 ip( 网际协议 ) 、 ICMP(Internet 互连网控制报文协议 ) 以及 IGMP(Internet 组管理协议 ) 。(3) 传输层:该层主要为两台主机的应用程序提供端到端的数据通信,它分为两个不同的协议: TCP( 传输控制协议 ) 和 UDP( 用户数据报协议 ) 。 TCP 提供端到端的质量保证的数据传输,该层负责数据的分组,质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。 UDP 则只提供简单的把数据从一端发送到另外一端,至于数据是否到达或按时到达、数据是否损坏都必须由应用层来做。这两种协议各有用途,前者可用于面向连接的应用,而后者则在及时性服务中有着重要的用途,如网络多媒体通信等。
![Page 5: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/5.jpg)
(4) 应用层:该层负责处理实际的应用程序细节,包括大家十分熟悉的 Telnet (电子公告版) ,HTTP(World Wide Web 服务 ),SMTP( 简单邮件传输协议 ),FTP( 简单文件传输协议 ) 和 SNMP( 简单网络管理协议 ) 等著名协议。
Web 服务器 Web 服务器http 协议
TCP TCPtcp 协议
IP IPIPIp 协议 Ip 协议
以太网驱动程序 以太网驱动程序 令牌环网驱动程序 令牌环网驱动程序
令牌环
路由器
以太网
![Page 6: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/6.jpg)
2.2 winsock 网络编程技术 由于 Winsock 的服务是以动态链接库Winsock Dll形式实现的 ,所以必须先调用 WSAStartup函数对 Winso
c Dll进行初始化,协商Winsock 的版本支持,并分配必要的资源。如果在调用 Winsock函数之前,没有加载 winsock库,则会返回 SOCKET_ERROR错误 , 在应用程序关闭套接字后,还应调用 WSACleanup函数终止对 Winsock Dll 的使用,并释放资源,以备下次使用 .2.2.2 错误检查和控制: 错误检查和控制对于 Winsock 应用程序是至关重要的,不成功的 Winsock调用返回的最常见的值是 SOCKET_ERROR ,它是值为 -1 的常量。如果错误发生了,可以用WSAGetLastError函数来获得一段代码,这段代码明确地表明错误的原因。:
2.2.1 Winsock 的启动和终止:
![Page 7: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/7.jpg)
2.2.3 Winsock编程模型: socket()
服务器
bind()
listen()
accept()
阻塞,等待客户数connect()
socket()
客户机
建立连接
write()read()请求数据
处理服务请求
write() read()应答数据
close() close()
![Page 8: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/8.jpg)
2.3.1 多线程技术介绍 :
2.3 windows 多线程编程技术 在 Windows 的一个进程内,包含一个或多个线程,线程是指进程的一条执行路径,它包含独立的堆栈和 CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件,信号标识及动态分配的内存等等,一个进程的所有线程使用同一个 32位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行。线程具有优先级别,优先权低的线程必须等到优先权较高的线程执行完任务后再执行,在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样就可使处理器的任务平衡,也提高了系统的效率。进程的主线程在任何需要的时候都可以创建新的线程,当线程执行完任务后,自动终止线程,当进程结束后,所有的线程都终止。
![Page 9: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/9.jpg)
2.3.2线程的创建和终止线程: Win32函数库中提供了多线程控制的操作函数,包括创建线程、终止线程、建立互斥区等。首先,在应用程序的主线程或其他活动线程的适当地方创建新的线程,创建了新线程后,则该线程就开始启动执行了当线程函数返回后,线程自动终止,如果线程在执行中终止的话,则可以调用函数实现 , 相关函数等请查看论文
3 SMTP 服务器概要设计3.1本服务器实现的命令集:HELO,MAIL FROM,RCPT TO,DATA,RSET,NOOP,QUIT,HELP
3.2 SMTP 服务器工作流程图 :
![Page 10: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/10.jpg)
smtp 服务器主线程开启端口 25 ,开始监听一个客户发起连接请求要求服务
服务器开启一个新线程为该客户服务
是否已经达到最大连接数 MAX_CONNECTION_NUM
否
向该用户发送连接数过多信息,并关闭相应连接
是
3.2.1 SMTP 服务器主线程流程 :
3.2.2 SMTP 服务器客户服务线程流程 :
![Page 11: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/11.jpg)
获得 客 户 服 务 id号根据 id号将客户登录信息记入 Sy
stem.log日志文件
读取客户发送命令并处理命令
返回客户处理结果
3.2.3 SMTP 服务器客户端命令处理流程 :
读入客户输入的第一条命令
是 HELO吗响应 503 ,并读入下条命令
不是
响应 250欢迎信息
![Page 12: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/12.jpg)
处理 MAIL FROM命令
否下条命令为 MAIL FR
OM?
是
下条命令为 RCPT TO?
是 处理 RCPT TO命令否
下条命令为 DATA?是 处理 DATA命令
下条命令为 REST?是 处理 REST命令
下条命令为 NOOP?
下条命令为 HELP?
下条命令为 QUIT?
处理 NOOP命令是
处理 HELP命令是
否
否
否
否 是 处理 QUIT命令
向客户输出 502 命令不可实现,并读入下条信息
![Page 13: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/13.jpg)
3.2.3 SMTP 服务器各个命令详细处理流程 :(见论文 )
4 POP3 服务器概要设计4.1本服务器实现的命令集:
USER PASS DELE LIST LOOP RETR RSET STAT UIDL QUIT
4.2 pop3 服务器工作流程图 :
pop3 服务器主线程开启端口 110 ,开始监听一个客户发起连接请求要求服务
4.2.1 pop3 服务器主线程流程图 :
![Page 14: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/14.jpg)
服务器开启一个新线程为该客户服务
是否已经达到最大连接数 MAX_CONNECTION_
NUM
否
向该用户发送连接数过多信息,并关闭相应连接
是
4.2.2 pop3 服务器客户服务线程流程 :
获得客户服务 id号根据 id号将客户登录信息记入 Sy
stem.log日志文件
读取客户发送命令并处理命令
返回客户处理结果
![Page 15: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/15.jpg)
4.2.3 pop3 服务器客户端命令处理流程 :
读入客户输入的下一条命令处理 USER命令
否命令为 USER?
是
命令为 PASS?是 处理 PASS命令
否命令为 STAT?
是 处理 STAT命令
命令为 DELE?
是 处理 DELE命令
命令为 LIST
命令为 RETR
处理 LIST命令是
处理 RETR命令是
否
否
否
否
①
![Page 16: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/16.jpg)
命令为 RSET? 处理 RSET命令
向客户输出命令不可实现
命令为 UIDL
命令为 LOOP?
命令为 QUTI?
处理 UIDL命令是
是
是
处理 LOOP命令
处理 QUIT命令
否
否
否
否
是命令为 RSET?①①
4.2.3 pop3 服务器各个命令详细处理流程 :(见论文 )
![Page 17: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/17.jpg)
5 SMTP 服务器和 POP3 服务器详细设计 (见论文 )
6 测试6.1 c 语言编写的测试程序6.1.1 SMTP 服务器简单测试程序
(1)建立和 SMTP 服务器连接(2) 发送 HELO命令并读取服务器响应信息(3) 发送 MAIL FROM命令并回显服务器返回信息(4) 发送 RCPT TO命令并回显服务器返回信息
![Page 18: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/18.jpg)
(5) 发送 DATA命令通知(6) 发送邮件正文并回显服务器信息(7) 发送 QUIT命令结束和服务器的会话(8)SMTP测试程序命令行显示结果
6.1.2 POP3 服务器测试程序
![Page 19: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/19.jpg)
(1)建立和 POP3 服务器的连接
(10)POP3 服务器测试程序命令行运行效果(9) 发送” QUIT”命令并回显服务器信息(8) 发送” DELE 1”并回显服务器信息(7) 发送” RETR 1”并回显服务器信息(6) 发送” LIST 1”并回显服务器信息(5) 发送” LIST”命令并回显服务器信息(4) 发送” STAT”命令并回显服务器信息(3) 发送” PASS 198517”命令并回显服务器信息(2) 发送” USER wangjianlin1985”命令并回显服务器信息
![Page 20: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/20.jpg)
6.2 php Web 客户端测试程序 :
![Page 21: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/21.jpg)
6.2.1 以用户名 wangjianlin1985 密码 198517登陆 php 邮件客户端
6.2.2进入邮件系统后显示如下 :
![Page 22: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/22.jpg)
6.2.3进入收件箱查看邮件列表 :
![Page 23: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/23.jpg)
6.2.4查看邮件详细内容 :
![Page 24: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/24.jpg)
6.2.5 给 [email protected]写一封邮件并抄送给[email protected]:
![Page 25: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/25.jpg)
6.2.6 发送邮件后回显的执行命令状态
![Page 26: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/26.jpg)
![Page 27: 基于 WinSock 的邮件系统](https://reader031.fdocuments.net/reader031/viewer/2022012306/56813ffe550346895dab2f1e/html5/thumbnails/27.jpg)