基于POP3协议的电子邮件接收程序的设计论文

南阳理工学院

毕业设计论文

题 目 学 院 专 业 基于POP3协议的电子邮件接收程序的设计 软件学院 软件工程 08级软件工程7班

王志杰

刘凯

班 级 姓 名 指导教师

2012 年 3 月 26 日

目 录

摘 要 ............................................................................................................................................. 2

1、引 言 .................................................................................................................................. 3

1.1 课程设计的内容 ............................................................................................................... 3

1.2 课程设计的要求 ............................................................................................................... 3

2、设计平台简介 ...................................................................................................................... 3

2.1 VC++ ................................................................................................................................... 3

3、邮件接收协议 ...................................................................................................................... 5

3.1 POP3简介 .......................................................................................................................... 5

4、设计原理 ............................................................................................................................... 8

4.1 POP3交互模型 ............................................................................................................ 8

5、课程设计步骤 ...................................................................................................................... 9

5.1 函数构造 ............................................................................................................................ 9

5.2 接收邮件的步骤 ............................................................................................................. 15

6、测试 ....................................................................................................................................... 19

6.1 测试目的 .......................................................................................................................... 19

6.2 测试环境 .......................................................................................................................... 19

6.3 测试结果 .......................................................................................................................... 19

6.4 结果分析 .......................................................................................................................... 20

7、出现的问题及解决方法 ................................................................................................. 20

7.1设计中出现的问题 .......................................................................................................... 20

7.2解决方法 ........................................................................................................................... 20

参考文献 ........................................................................................................................................ 21

摘 要

电子邮件可以使人们有效地进行电子化的数据异地交换。Internet以电子邮件服务推动着人类的通信行为不断发展,邮件的接收系统。本论文以Visual C#为开发平台,利用Socket 套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。

随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以Visual C#为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。

关键词 课程设计;电子邮件;接收程序;POP3;Socket;Visual C#

1、引 言

随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以Visual C#为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。

1.1 毕业设计的内容

运用C#语言设计一个邮件程序实现邮件的接收

1.2 毕业设计的要求

(1)按要求编写课程设计报告书,能正确阐述设计结果。

(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。

(3)学会文献检索的基本方法和综合运用文献的能力。

(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。

2、设计平台简介

2.1 Visual C#

(1)背景

VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C++的一个开发平台。VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等

等;COM是代码共享的二进制标准,需要掌握其基本原理等等。

Visual C#作为Visual Studio的一个组件,可以通过安装Visual Studio来获得。VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。

(2)基本模式

Visual C#应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式。VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能。最大缺点是开发效率不高。

(3)适用范围【1】

1、 VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层的调用。在VC里边嵌入汇编语言很简单。

2、 VC主要用在驱动程序开发。

3、 VC执行效率高,当对系统性能要求很高的时候,可用VC开发。

4、 VC主要适用于游戏开发。

5、 VC多用于单片机,工业控制等软件开发,如直接对I/O地址操作,就要用C++。

6、 VC适用开发高效,短小,轻量级的COM组件,DLL。比如WEB上的控件。

7、 VC可以开发优秀的基于通信的程序。

8、 VC可以开发高效灵活的文件操作程序。

9、 VC可以开发灵活高效的数据库操作程序。

10、VC是编CAD软件的唯一选择。包括AUTOCAD,UG的二次开发。

11、 VC在多线程、网络通信、分布应用方面,VC++有不可比拟的优势。

3、邮件接收协议

3.1 POP3简介

POP3(Post Office Protocol Version 3),即邮局办公协议,该协议用于接收邮件的双方( 客户机、POP3服务器)进行通信。使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。POP3协议允许用户以一定的方式从保存邮件的服务器( 即POP3服务器)上取走自己的邮件。

3.2 POP3协议工作原理【2】

POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。客户机能够发送的命令与它所处的状态有关。协议中定义了三种状态:即确认状态(Authorization State)、处理状态(Transaction State)和更新状态(Update State)。在不同的状态下,客户机可以向服务器发送的命令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。

图3.2.1 POP3的状态转换示意图

表3.2.1 一些常用的POP3命令

POP3服务器一般使用的是TCP的110号端口。当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。

通过POP3命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件进行删除或修改操作都无需与服务器进一步交互。客户机向服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。服务器响应是由一行或多行组成,其中,第一行以ASCII文本+OK, 或-ERR开始,分别指出相应的操作是成功还是失败。

POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以( 回车换行符)作为其结束标志。关键字和参量必须是非控制符的ASCII码字符。关键字和参量之间,参量和参量之间由一个空格字符分隔开。关键字长不大于四个字符,每个参量最长可到40个字符。

POP3响应包含一个状态标志和一个跟随其后的附加信息。响应也用

作为其结束标志。响应最长到512字节,其中包括协议定义了两个状态标志:正确(“ +OK”)和错误(“ -ERR”)。服务器用大写格式发送“ +OK”和“ -ERR”。如果响应是多行的,则每行以结束。当响应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点“.”和一个对【3】。

4、设计原理

4.1 POP3交互模型

该模型基本原理为:POP3接收者对POP3

发送者进行初始化连接,发送者对接收者发送询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。接收者则开始接收数据。发送者发送完数据后,提出断开请求,并断开连接。数据接收过程完成。

5、课程设计步骤

5.1 函数构造

Windows Socket类是对Windows Socket API的封装,其中包括,CSocket和cAsyncSocket类,使用它们能够大大简化网络通信程序的编写。套接字的数据结构中包括下面五种数据:

(1)本机主机端口:接收报文或数据报的进程。

(2)本机主机地址:接收数据包的主机。

(3)远地协议端口:目的进程或程序。

(4)远地主机端口:目的主机。

(5)协议:程序在网络上传输数据时使用的协议。

本应用程序就是使用Windows sockets编程设计的。

在接收电子邮件时,必然需要涉及到连接服务器,接收数据,接收响应以及断开等一系列操作.这就需要设计一个类来封装这些操作,在该应用程序中制定了一个CSMTP类。该类的定义如下所示,

#define SMTP_PORT 25

#define RESPONSE_BUFFER_SIZE 1024

class CSMTP

{

Public;

CSMTP(LPCTSTR szSMTPServerName,UINT nPort=

SMTP_PORT);

virtual~CSMTP();

void SetServerProperties(LPCTSTR szSMTPserverName,

UINT nPort=SMTP_PORT);

CString GetlastError();

UINT GetPort();

BOOL Disconnect();

BOOL Connect();

virtual BOOL FormatMAilMessage(CMailMessage * msg

);

BOOL getMessage(CMailMessage * msg); CString GetserverHostName(); Private;

BOOL get_response(UINT response_expected); CString cook_body(CMailMessage * msg); CString m_serror; BOOL m_bconnected; UINT m_nPort;

CString m_sSMTPServerHostName; CSocket m_wsSMTPServer; protected;

virtuaI BOOL transmit_message(CMailMessage * msg );

struct response_code {

UINT nResponse; TCHAR * sMessage; };

enum eResponse {

GENERIC_SUCCESS = O, CONNECT_SUCCESS, DATA_SUCCESS, QUIT_SUCCESS, LAST_RESPONSE );

TCHAR * response_buf;

static response_code response_table[];);

其中,m_sError成员代表错误信息,m_bConnected表示是否建立连接;m_bPort表示SMTP服务器所使用的端口号,m_sSMTPserverHostName表示SMTP服务器的主

机名(地址);m_waSMTPserver则为将与SMTP服务器建立连接的套接字对

象;response_table表示由服务器返回的响应,而eResponse列举了所有可能出现的错误。

因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。例如,邮件必须在邮件头和邮件体后发送,而在收信时,先需要解析邮件头和邮件体.CMailMessage类是对邮件进行格式化编码的一个类【4】。 CSMTP类的构造函数如下所示:

CSMTP: ; CSMTP(LPCTSTR szSMTPServerName, UINT nPort)

{ASSERT(szSMTPServerName l = NULL); AfxSocketInit();

m_sSMTPserverHostName = azSMTPServerName; m_nPort = nPort; m_bConnected = FALSE; m_sError = _T(“OK”); response_buf = NULL;}

在这里调用AfxsocketInit函数以初始化Window Sockets类的使用,此外还验证其他类成员是否合法,或为其赋值。

#include "mySock.h" //添加套接字类的包含文件 .........

class CPop3Dlg : public CDialog {

// Construction public:

void Disp(LONG flag); //在不同的会话阶段显示不同的信息 mySock pop3Socket; //套接字类对象实例

CPop3Dlg(CWnd* pParent = NULL); // standard constructor ...........

(2)pop3Dlg.cpp实现文件 #include "stdafx.h" #include "pop3.h"

#include "pop3Dlg.h"

#include "mySock.h" //手工添加的包含语句 ...................

BOOL CPop3Dlg::OnInitDialog() {

.............

// TODO: Add extra initialization here //用户在这里添加控件成员变量的初始化代码

m_strServer = _T("pop.sina.com.cn"); //POP3服务器地址 m_strUser = _T("example"); //邮箱的用户名 m_strPass = _T("123456"); //口令

m_bolDel = FALSE; //下载邮件后不删除 m_Info = _T(""); //多文本框清空

return TRUE; // return TRUE unless you set the focus to a control }

.................

//以下是事件处理函数和其他成员函数的代码 //当用户点击"连接"按钮时,执行此函数 void CPop3Dlg::OnBtnConn() {

//设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息 pop3Socket.SetParent(this);

UpdateData(TRUE); //取来用户在对话框中输入的数据 pop3Socket.Create(); //创建套接字对象的底层套接字 pop3Socket.Connect((LPCSTR)m_strServer,110); //连接pop3服务器 m_Info = ""; //多文本列表框清空 UpdateData(FALSE); //更新用户界面 }

//当用户点击"断开"按钮时,执行此函数 void CPop3Dlg::OnBtnDisc()

{

pop3Socket.Close(); }

//当用户点击"查看邮件"按钮时,执行此函数 void CPop3Dlg::OnBtnView() { int i;

i = m_ctrList.GetCurSel(); //获得用户在组合框中的选择 //获得并显示指定信件的基本属性及信件内容 m_Info += pop3Socket.GetMsgStuff(i); m_Info += pop3Socket.GetMsgBody(i); }

//在不同的情况下,向用户显示不同的信息 void CPop3Dlg::Disp(LONG flag) {

CString s; switch(flag) {

case S_CONNECT: //已连接到服务器,显示信息 s = "已连接到"+m_strServer+"...\r\n"; m_Info+=s; //禁用连接按钮

GetDlgItem(IDC_BTN_CONN)->EnableWindow(FALSE); //启用断开按钮

GetDlgItem(IDC_BTN_DISC)->EnableWindow(TRUE); //禁用查看邮件按钮

GetDlgItem(IDC_BTN_VIEW)->EnableWindow(FALSE); break;

case S_RECEIVE://收到服务器发来的响应,显示它的内容

m_Info+=pop3Socket.lastMsg; break;

case S_CLOSE: //显示关闭连接的信息 m_Info+=pop3Socket.error; s = "连接已经关闭\r\n"; m_Info+=s; //启用连接按钮

GetDlgItem(IDC_BTN_CONN)->EnableWindow(TRUE); //禁用断开按钮

GetDlgItem(IDC_BTN_DISC)->EnableWindow(FALSE); break;

case S_GETNUM: //已经知道了邮箱中信件的总数

s.Format("邮箱中共有 %d 封信\r\n",pop3Socket.numMsg); m_Info+=s; break;

case S_GETSIZE: //显示信件的大小

s.Format("信箱中信件大小为:%d字节\r\n",pop3Socket.sizeMsg); m_Info+=s; break;

case S_ENDRETR: //所有信件已下载完毕,显示信息

s.Format("共下载了 %d 封信件\r\n",pop3Socket.msgs.size()); m_Info+=s;

//如果有信件下载,启用查看邮件按钮 if((pop3Socket.msgs.size())>0)

GetDlgItem(IDC_BTN_VIEW)->EnableWindow(TRUE); break; }

UpdateData(FALSE); //更新用户界面 }

//当点击“存储”按钮时,执行此函数。

void CPop3Dlg::OnBtnSave() { int i; CString s;

i = m_ctrList.GetCurSel();

//获得指定信件的基本属性及信件内容 s = pop3Socket.GetMsgStuff(i); s += pop3Socket.GetMsgBody(i);

CFileDialog dlg(FALSE); if(dlg.DoModal()==IDOK) {

CFile file(dlg.GetPathName(),

CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); file.Write((LPCSTR)s,s.GetLength()); file.Close(); } }

5.2 接收邮件的步骤

(1). 建立与服务器的连接。具体工作由Connect函数完成。部分Connect函数代码如下所示:

BOOL CSMTP:; Connect() { „„

if(! m_wsSMTPServer.Create()) {m_sError=_T(“无法创建套接字!”); delete response_buf; response_buf = NULL; return FALSE;)

if(! M_wsSMTPserver.Connect(GetServerHostName (),GetPort()))

{m_sError = _T(“无法连接到服务器”); M_sSMTPserver.Close(); delete response_but; response-buf = NULL; return FALSEI;}

if(! Get_response(CONNECT_SUCCESS)) {m_sError = _T(“服务器投有响应”); M_wsSMTPServer.Close(); delete response_buf; response_buf = NULL; return FALSE;)

sHello.Format(_T(“HELO%s\r\n”),local_host); m_wsSMTPServer.Get((LPCTSTR)sHello,sHello. Getlength()); „„}

(2).建立连接后从服务器接收邮件。这个工作由GetMessage函数完成。GetMessage函数代码如下:

BOOL CSMTP::GetMessage(CMailMessage * msg) {if(! m_bConnected)

{m_sError = _T(“必须首先创建连接!”); return FALSE;)

if(FormatMailMessage(msg)==FALSE) {return FALSE;)

if(transmit_message(msg)==FALSE) {return FALSE;) return TRUE;)

前面介绍过电子邮件有其特殊的格式,在这里FormatMailMessage函数就是用于格式化邮件信息的。Transmit_message函数将邮件进到服务器上。部分Transmit_message函数代码如下所示:

BOOL CSMTP::transmit_message(CMailMessage * msg)

{„„sFrom.Format_T(“MAIL From:\r\n” ),(LPCTSTR)msg一>m_sFrom);

M_wsSMTPServer.Get((LPCTSTR)sFrom,sFrom. GctLength());

if(! Get_response(GENERIC_SUCCESS)) return FALSEl;

for(int i=O;iGetNumRecipients(); i++) {msg一>GetRecipient(sEmail,sTemp,i); sTo.Format(_T(“RCPT TO;\r\n”),(LPCT STR)sEmail);

m_wsSMTPServer.Get( (LPCTSTR)sTemp,sTemp. GetLength());

Get_response(GENERIC_SUCCESS);) sTemp=_T(“DATA\r\n”);

m_wsSMTPServer.Get((LPCTSTR)sTemp,sTemp. GetLength());

if(! Get_response(DATA_SUCCESS)) {return FALSE;}

m_wsSMTPserver.Get((LPCTSTR)msg一>m_ sHeader,g一>m_sHeader.GetLength()); sTemp = cook_body(msg);

m_wsSMTPServer.Get((LPCTSTR)sTemp,sTemp. GetLength());

sTemp = _T(“\r\n.\r\n”);

m_wsSMTPServer.Get((LPCTSTR)sTemp,sTemp. GetLength());

if{! Get_response(GENERIC_SUCCESS)) {return FALSE;} Return TRUE;}

在此函数中,首先发送MAIL命令,通知服务器收信人的邮箱地址。然后发进RCPT命令,通知服务器发信人的邮箱地址。需要注意的是,在有多个发信人

时,必须为每个发信人都发送一次RCPT命令,通知服务器将要进行邮件数据的传输。此后,分别将邮件头和邮件体从服务器上接收下来。这里需要注意一点:当邮件数据接收完毕后,需要额外发送一个“回车/换行„„回车/换行”信号,以通知邮件数据传输完毕.

(3). 当邮件接收完毕后,一般不需要保持与SMTP服务器的连接,而断开的工作由Disconnect函数完成。Disconnect代码如下:

BOOL CSMTP: : Disconnect() {BOOL ret; if(! m_bConnected) return TRUE;

CString sQuit = _T(“QUIT\r\n”);

m_wsSMTPserver.send((LPCTSTR)sQuit,sQuit. GetLength());

Ret = get_response(QUIT_SUCCESS); m_wsSMTPServer.Close(); if(response_buf ! = NULL) {delete[]response_buf; Response_buf = NULL;} M_bConnected = FALSE; return ret;}

首先向SMTP服务器发送QUIT命令,关闭邮件传输会话;然后调用套接字对象的Close函数关闭套接字,最后将类对象所占用的内存释放。

6、测试

6.1 测试目的

检测邮件接收程序是否能接收邮件。

6.2 测试环境

Windows XP

6.3 测试结果

与服务器取得联系之后,对目标邮件进行接收,证明邮件可以正常接收,具体的接收界面如下图6.3.1所示:

图6.3.1接收电子邮件程序主界面

6.4 结果分析

邮件接收成功,本程序实现邮件接收功能。

7、出现的问题及解决方法

7.1设计中出现的问题

(1)设计初没有接触尝试过对相似系统的设计; (2)设计时编写程式不是很顺利; (3)调试程序是出现很多错误; (4)软件界面过于简洁。

7.2解决方法

(1)找来相关资料,经过一番研究,对该系统有了较清晰的认识,才开始着手于正式设计。

(2)经过一段时间的研究,找到了可行的函数模式。 (3)不断地耐心调试,直至出现满意的结果。 (4)经过相应的修改,终于达到了较好的效果。

参考文献

[1] Al Stevens,Clayton Walnum 著,林丽闺,别红霞等译.标准C++宝典,2001. 北京:电子工业出版社.

[2]朱岩,高伟 编著.标准Windows程序设计-Visual C++与MFC及Win32 API的应用,1997.北京:人民邮电出版社.

[3]李博轩等 著. Visual C++6.0 网络及 Internet开发指南[M],2000.北京:清华大学出版社.

[4]邓亚平 著.计算机网络[M],1999.北京:北京邮电出版社.


相关文章

  • 邮件服务器的配置与应用
  • 邮件服务器的配置与应用 本科生毕业论文(设计) 题 目: 学生姓名:邮件服务器的配置与应用 武鹏鹏 2010年5月 目 录 摘要(关键字) ........................................................ ii Abstract(Key words) ...

  • 目前的电子邮件基本上都是通过POP3网络协议接收的根据...
  • 目前的电子邮件基本上都是通过POP3网络协议接收的.根据POP3的规定,当一个电子邮件程序需要接收电子邮件时,该程序同POP3服务程序需要建立起双向的传输通道.和SMTP类似,当传输通道成功建立后,电子邮件程序会向POP3服务程序发送一系列基于ASCII字符的命令,而POP3服务程序会对这些命令产生 ...

  • SMTP简单邮件传输协议
  • 一个网络可以由公用互联网上 TCP 可相互访问的主机.防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成.使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输. 在这 ...

  • 南昌大学毕业设计范文
  • 密级: NANCHANG UNIVERSITY 学 士 学 位 论 文 THESIS OF BACHELOR (20 - 20 年) 题 目 基于JAVA的宿舍管理系统开发 学 院: 软件学院 系 软件工程 专业班级: WEB084 学生姓名: 指导教师: 起讫日期: 摘要 基于JAVA的宿舍管理系 ...

  • 电子邮件试题
  • <信息技术基础>(电子邮件部分) 强化练习 1.如果E-mail 地址是[email protected],那么用该邮箱地址发送邮件范围:( ) A .只能是云南 B.只能是中国 C.只能是教育部门 D.可以是全世界 2.某同学以myname 为用户名在新浪网(http://www ...

  • YEETEC IAS网络审计系统产品白皮书-20**年0926
  • YEETEC 网络审计系统 产品白皮书 以太科技股份有限公司 YEETEC 网络审计系统YT-NAS 系列产品技术白皮书V3.0 目 录 1. 前言............................................................................ ...

  • 北邮-信息网络应用基础开卷考试资料
  • 第一章 概述 • 想出一个信息网络应用系统的例子/你感兴趣的目前还没 答:餐厅供餐网络公示系统.具体实现功能如下: 1. 公示校内各个餐厅的开放时间,若有特殊原因关闭,短信通知校内师生: 2. 网络主页上列出每餐供应菜肴,供图有真相,以便师生择厅就餐: 3. 设定餐后评价交互页面,由师生将个人喜好及 ...

  • 网络考试选择题
  • (3)Internet主要由__B______.通信线路.服务器与客户机和信息资源四部分组成. A)网关 B)路由器 C)网桥 D)集线器 知识点:Internet的基本结构与主要服务 评 析:Internet的主要组成部分 ① 通信线路:②路由器:③服务器与客户机:④信息资源. (4)在IP协议中 ...

  • [计算机网络与多媒体技术]答案
  • 一选择题 1.下列哪些不属于虚拟局域网的作用?(D) A) 由网段和站点构成的逻辑工作组 B) 通过交换机(或路由器)划分 C) 同一虚拟局域网中的节点不受物理位置的限制而像处于同一个局域网中那样 互相访问 D) 用交换机划分的若干个在逻辑上关联 2.下列哪些不属于内容管理系统的特点?(C) A) ...

© 2024 范文中心 | 联系我们 webmaster# onjobs.com.cn