27
基基 WinSock 基基基基1 基基基基 : 1.1 SMTP 基基基基基基基 (c 基基 ) 1.2 POP3 基基基基基基基 (c 基基 ) 1.3 php WebMail 基基基

基于 WinSock 的邮件系统

  • Upload
    lesley

  • View
    116

  • Download
    3

Embed Size (px)

DESCRIPTION

基于 WinSock 的邮件系统. 1.1 SMTP 发送邮件服务器 (c 语言 ). 1.2 POP3 接受邮件服务器 (c 语言 ). 1 设计目标 :. 1.3 php WebMail 客户端. 2 相关技术介绍 :. 2.1 TCP/IP 协议. - PowerPoint PPT Presentation

Citation preview

Page 1: 基于 WinSock 的邮件系统

基于 WinSock 的邮件系统1 设计目标 :

1.1 SMTP 发送邮件服务器 (c 语言 )1.2 POP3 接受邮件服务器 (c 语言 )

1.3 php WebMail 客户端

Page 2: 基于 WinSock 的邮件系统

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 的邮件系统

各种应用层协议

TCP UDP

IP

设备驱动程序及接口卡

应用层

传输层网络层链路层

2.1.3 各层功能概述 :

(1) 链路层:有时被称作数据链路层或网络接口层,通 常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆 ( 或其他任何传输媒介 )的物理接口细节。该层包含的协议有 :ARP( 地址转换协议 ) 和 RARP( 反向地址转换协议 ).

Page 4: 基于 WinSock 的邮件系统

(2) 网络层:有时又被称为互连网层,负责分组在网络中的活动,包括 ip( 网际协议 ) 、 ICMP(Internet 互连网控制报文协议 ) 以及 IGMP(Internet 组管理协议 ) 。(3) 传输层:该层主要为两台主机的应用程序提供端到端的数据通信,它分为两个不同的协议: TCP( 传输控制协议 ) 和 UDP( 用户数据报协议 ) 。 TCP 提供端到端的质量保证的数据传输,该层负责数据的分组,质量控制和超时重发等,对于应用层来说,就可以忽略这些工作。 UDP 则只提供简单的把数据从一端发送到另外一端,至于数据是否到达或按时到达、数据是否损坏都必须由应用层来做。这两种协议各有用途,前者可用于面向连接的应用,而后者则在及时性服务中有着重要的用途,如网络多媒体通信等。

Page 5: 基于 WinSock 的邮件系统

(4) 应用层:该层负责处理实际的应用程序细节,包括大家十分熟悉的 Telnet (电子公告版) ,HTTP(World Wide Web 服务 ),SMTP( 简单邮件传输协议 ),FTP( 简单文件传输协议 ) 和 SNMP( 简单网络管理协议 ) 等著名协议。

Web 服务器 Web 服务器http 协议

TCP TCPtcp 协议

IP IPIPIp 协议 Ip 协议

以太网驱动程序 以太网驱动程序 令牌环网驱动程序 令牌环网驱动程序

令牌环

路由器

以太网

Page 6: 基于 WinSock 的邮件系统

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 的邮件系统

2.2.3 Winsock编程模型: socket()

服务器

bind()

listen()

accept()

阻塞,等待客户数connect()

socket()

客户机

建立连接

write()read()请求数据

处理服务请求

write() read()应答数据

close() close()

Page 8: 基于 WinSock 的邮件系统

2.3.1 多线程技术介绍 :

2.3 windows 多线程编程技术 在 Windows 的一个进程内,包含一个或多个线程,线程是指进程的一条执行路径,它包含独立的堆栈和 CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件,信号标识及动态分配的内存等等,一个进程的所有线程使用同一个 32位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行。线程具有优先级别,优先权低的线程必须等到优先权较高的线程执行完任务后再执行,在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样就可使处理器的任务平衡,也提高了系统的效率。进程的主线程在任何需要的时候都可以创建新的线程,当线程执行完任务后,自动终止线程,当进程结束后,所有的线程都终止。

Page 9: 基于 WinSock 的邮件系统

2.3.2线程的创建和终止线程: Win32函数库中提供了多线程控制的操作函数,包括创建线程、终止线程、建立互斥区等。首先,在应用程序的主线程或其他活动线程的适当地方创建新的线程,创建了新线程后,则该线程就开始启动执行了当线程函数返回后,线程自动终止,如果线程在执行中终止的话,则可以调用函数实现 , 相关函数等请查看论文

3 SMTP 服务器概要设计3.1本服务器实现的命令集:HELO,MAIL FROM,RCPT TO,DATA,RSET,NOOP,QUIT,HELP

3.2 SMTP 服务器工作流程图 :

Page 10: 基于 WinSock 的邮件系统

smtp 服务器主线程开启端口 25 ,开始监听一个客户发起连接请求要求服务

服务器开启一个新线程为该客户服务

是否已经达到最大连接数 MAX_CONNECTION_NUM

向该用户发送连接数过多信息,并关闭相应连接

3.2.1 SMTP 服务器主线程流程 :

3.2.2 SMTP 服务器客户服务线程流程 :

Page 11: 基于 WinSock 的邮件系统

获得 客 户 服 务 id号根据 id号将客户登录信息记入 Sy

stem.log日志文件

读取客户发送命令并处理命令

返回客户处理结果

3.2.3 SMTP 服务器客户端命令处理流程 :

读入客户输入的第一条命令

是 HELO吗响应 503 ,并读入下条命令

不是

响应 250欢迎信息

Page 12: 基于 WinSock 的邮件系统

处理 MAIL FROM命令

否下条命令为 MAIL FR

OM?

下条命令为 RCPT TO?

是 处理 RCPT TO命令否

下条命令为 DATA?是 处理 DATA命令

下条命令为 REST?是 处理 REST命令

下条命令为 NOOP?

下条命令为 HELP?

下条命令为 QUIT?

处理 NOOP命令是

处理 HELP命令是

否 是 处理 QUIT命令

向客户输出 502 命令不可实现,并读入下条信息

Page 13: 基于 WinSock 的邮件系统

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 的邮件系统

服务器开启一个新线程为该客户服务

是否已经达到最大连接数 MAX_CONNECTION_

NUM

向该用户发送连接数过多信息,并关闭相应连接

4.2.2 pop3 服务器客户服务线程流程 :

获得客户服务 id号根据 id号将客户登录信息记入 Sy

stem.log日志文件

读取客户发送命令并处理命令

返回客户处理结果

Page 15: 基于 WinSock 的邮件系统

4.2.3 pop3 服务器客户端命令处理流程 :

读入客户输入的下一条命令处理 USER命令

否命令为 USER?

命令为 PASS?是 处理 PASS命令

否命令为 STAT?

是 处理 STAT命令

命令为 DELE?

是 处理 DELE命令

命令为 LIST

命令为 RETR

处理 LIST命令是

处理 RETR命令是

Page 16: 基于 WinSock 的邮件系统

命令为 RSET? 处理 RSET命令

向客户输出命令不可实现

命令为 UIDL

命令为 LOOP?

命令为 QUTI?

处理 UIDL命令是

处理 LOOP命令

处理 QUIT命令

是命令为 RSET?①①

4.2.3 pop3 服务器各个命令详细处理流程 :(见论文 )

Page 17: 基于 WinSock 的邮件系统

5 SMTP 服务器和 POP3 服务器详细设计 (见论文 )

6 测试6.1 c 语言编写的测试程序6.1.1 SMTP 服务器简单测试程序

(1)建立和 SMTP 服务器连接(2) 发送 HELO命令并读取服务器响应信息(3) 发送 MAIL FROM命令并回显服务器返回信息(4) 发送 RCPT TO命令并回显服务器返回信息

Page 18: 基于 WinSock 的邮件系统

(5) 发送 DATA命令通知(6) 发送邮件正文并回显服务器信息(7) 发送 QUIT命令结束和服务器的会话(8)SMTP测试程序命令行显示结果

6.1.2 POP3 服务器测试程序

Page 19: 基于 WinSock 的邮件系统

(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 的邮件系统

6.2 php Web 客户端测试程序 :

Page 21: 基于 WinSock 的邮件系统

6.2.1 以用户名 wangjianlin1985 密码 198517登陆 php 邮件客户端

6.2.2进入邮件系统后显示如下 :

Page 22: 基于 WinSock 的邮件系统

6.2.3进入收件箱查看邮件列表 :

Page 23: 基于 WinSock 的邮件系统

6.2.4查看邮件详细内容 :

Page 24: 基于 WinSock 的邮件系统

6.2.5 给 [email protected]写一封邮件并抄送给[email protected]:

Page 25: 基于 WinSock 的邮件系统

6.2.6 发送邮件后回显的执行命令状态

Page 26: 基于 WinSock 的邮件系统
Page 27: 基于 WinSock 的邮件系统