FTP服务与客户端设计毕业设计论文

更新时间:2023-05-07 10:55:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

FTP服务与客户端设计毕业设计论文

摘要FTP为一种主流的网络文件传输协议。设计和实现FTP服务与客户

端,有助于深入明白得网络编程和FTP协议,使理论知识和实践结合起来。本文采纳VC++6.0编程工具设计和实现了FTP服务与客户端设计。其要紧设计工作为:服务器端设计和客户端设计。服务器端设计模块要紧有:服务器日志模块,在线用户模块,程序设置模块,统计模块,安全模块。客户端设计模块要紧有:连接服务器模块,上传文件模块,下载文件模块。通过实际测试和应用,验证了本文设计的正确性。

关键词FTP 服务器客户端VC++6.0

The design of FTP Server and Client

Abstract FTP is a mainstream network file transfer protocol. Design and

Implementation of FTP services and clients will help in-depth understanding of network programming and FTP, and make the theoretical knowledge and practice together. In this paper, using VC + +6.0 programming tool, the FTP server and client designe are designed and implemented. The main design work is for: the design of server and client . Server-side design modules are: server logs module, online modules, procedures set module, statistics module, the security module. lient design modules are: connect to server module, upload module, download files module.Through practical application and testing ,it verifys the correctness of the design of the paper.

Keywords FTP Sever Client VC++6.0

目录

第1章绪论 (2)

1.1FTP介绍 (2)

1.2VC++6.0介绍 (5)

1.3 本文工作内容 (7)

第2章系统整体设计 (7)

2.1 FTP服务器整体设计 (7)

2.2 FTP客户端整体设计 (8)

第3章FTP服务器模块设计 (9)

3.1服务器日志模块 (9)

3.2 在线用户模块 (14)

3.3 程序设置模块 (17)

3.4 统计模块 (20)

3.5 安全模块 (23)

第4章FTP客户端模块设计 (30)

4.1连接服务器模块 (31)

4.2 下载文件模块 (33)

4.3 上传文件模块 (38)

第5章结论和展望 (41)

致谢 (41)

参考文献 (42)

第1章绪论

1.1FTP介绍

FTP的要紧作用,确实是让用户连接上一个远程运算机(这些运算机上运行着FTP服务器程序)观看远程运算机有哪些文件,然后把文件从远程运算机上拷

到本地运算机,或把本地运算机的文件送到远程运算机去。

以下传文件为例,当启动FTP从远程运算机拷贝文件时,事实上启动了两个程序:一个本地机上的FTP客户程序:它向FTP服务器提出拷贝文件的要求。另一个是启动在远程运算机的上的FTP服务器程序,它响应要求把指定的文件传送到运算机中。FTP采纳“客户机/服务器”方式,用户端要在自己的本地运算机上安装FTP客户程序。FTP客户程序有字符界面和图形界面两种。字符界面的FTP的命令复杂、繁多。图形界面的FTP客户程序,操作上要简洁方便的多。简单地说,支持FTP协议的服务器确实是FTP服务器。

一样来说,用户联网的首要目的确实是实现信息共享,文件传输是信息共享专门重要的一个内容之一。Internet上早期实现传输文件,并不是一件容易的事,我们明白Internet是一个专门复杂的运算机环境,有PC,有工作站,有MAC,有大型机,据统计连接在Internet上的运算机已有上千万台,而这些运算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这确实是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,如此用户就能够把自己的文件传送给别人,或者从其它的用户环境中获得文件。

与大多数Internet服务一样,FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到那个文件,将其存放在用户名目中。

在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上载"(Upload)。"下载"文件确实是从远程主机拷贝文件至自己的运算机上;"上载"文件确实是将文件从自己的运算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上载(下载)文件。

使用FTP时必须第一登录,在远程主机上获得相应的权限以后,方可上载或下载文件。也确实是说,要想同哪一台运算机传送文件,就必须具有哪一台运算机的适当授权。换言之,除非有用户ID和口令,否则便无法传送文件。这种情形违抗了Internet的开放性,Internet上的FTP主机何止千万,不可能要求每个用户在每一台主机上都拥有帐号。匿名FTP确实是为解决那个问题而产生的。

匿名FTP是如此一种机制,用户可通过它连接到远程主机上,并从其下载文件,而无需成为其注册用户。系统治理员建立了一个专门的用户ID,名为anonymous, Internet上的任何人在任何地点都可使用该用户ID。

通过FTP程序连接匿名FTP主机的方式同连接一般FTP主机的方式差不多,只是在要求提供用户标识ID时必须输入anonymous,该用户ID的口令能够是任意的字符串。适应上,用自己的E-mail地址作为口令,使系统爱护程序能够记录下来谁在存取这些文件。

值得注意的是,匿名FTP不适用于所有Internet主机,它只适用于那些提供了这项服务的主机。当远程主机提供匿名FTP服务时,会指定某些名目向公众开放,承诺匿名存取。系统中的其余名目则处于隐匿状态。作为一种安全措施,大多数匿名FTP主机都承诺用户从其下载文件,而不承诺用户向其上载文件,也确实是说,用户可将匿名FTP主机上的所有文件全部拷贝到自己的机器上,但不能将自己机器上的任何一个文件拷贝至匿名FTP主机上。即使有些匿名FTP主机确实承诺用户上载文件,用户也只能将文件上载至某一指定上载名目中。随后,系统治理员会去检查这些文件,他会将这些文件移至另一个公共下载名目中,供其他用户下载,利用这种方式,远程主机的用户得到了爱护,幸免了有人上载有问题的文件,如带病毒的文件。

作为一个Internet用户,可通过FTP在任何两台Internet主机之间拷贝文件。然而,实际上大多数人只有一个Internet帐户,FTP主要用于下载公共文件,例如共享软件、各公司技术支持文件等。Internet上有成千上万台匿名FTP主机,这些主机上存放着数不清的文件,供用户免费拷贝。实际上,几乎所有类型的信息,所有类型的运算机程序都可以在Internet上找到。这是Internet吸引我们的重要缘故之一。匿名FTP使用户有机会存取到世界上最大的信息库,那个信息库是日积月累起来的,同时还在不断增长,永不关闭,涉及到几乎所有主题。而且,这一切是免费的。

匿名FTP是Internet网上公布软件的常用方法。Internet之因此能连续到今天,是因为人们使用通过标准协议提供标准服务的程序。像如此的程序,有许多确实是通过匿名FTP公布的,任何人都能够存取它们。Internet中的有数目庞大的匿名FTP主机以及更多的文件,那么到底如何样才能明白某一特定文件位于哪个匿名

FTP主机上的那个名目中呢?这正是Archie服务器所要完成的工作。Archie将自动在FTP主机中进行搜索,构造一个包含全部文件名目信息的数据库,使你能够直截了当找到所需文件的位置信息。

其支持两种模式,一种方式叫做Standard (也确实是Active,主动方式),一种是Passive (也确实是PASV,被动方式)。Standard模式FTP的客户端发送PORT 命令到FTPserver。Passive模式FTP的客户端发送PASV命令到FTP Server。

Standard模式FTP 客户端第一和FTP Server的TCP 21端口建立连接,通过那个通道发送命令,客户端需要接收数据的时候在那个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。

Passive模式在建立操纵通道的时候和Standard模式类似,当客户端通过那个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口同时通知客户端在那个端口上传送数据的要求,然后FTP server 将通过那个端口进行数据的传送,那个时候FTP server不再需要建立一个新的和客户端之间的连接。

现在的FTP软件里面包括在IE5以上的版本里面也差不多支持这两种模式了。一样一些FTP客户端的软件就比较好设置了,一样都有一个PASV的选项,比如CuteFTP,传输的方式都有Standard和PASV的选项,能够自己进行选择;另外在IE里面假如要设置成PASV模式的话能够选中工具-Internet选项-高级-为FTP站点启用文件夹视图,否则就采纳Standard模式。

1.2VC++6.0介绍

本课题设计采纳Microsoft Visual C++6.0作为开发工具。Visual c++是开发Windows应用程序的主流开发工具,能够利用的资源多。Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用Visual C++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。

Visual C++采纳的框架是MFC。MFC不仅仅是人们通常明白得的一个类库。你假如选择了MFC,也就选择了一种程序结构,一种编程风格。MFC 是一个专门大的、扩展了的C++ 类层次结构,它能使开发Windows 应用程序变得更加容易。MFC 是在整个Windows 家族

中差不多上兼容的,也确实是说,不管是Windows3.x、Windows95 依旧Windows NT,所使用的MFC 是兼容的。每当新的Windows 版本显现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也回得到扩展,添加新的特性、变得更加容易建立应用程序。使用MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正确、优化和功能强大的Windows 代码。你所调用的专门多成员函数完成了你自己可能专门难完成的工作。从这点上将,MFC 极大地加快了你的程序开发速度。

由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关怀对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。最重要的是MFC类库在提供的对象的各种属性和方法差不多上通过慎重的编写和严格的测试,可靠性专门高,这就保证了使用MFC类库可不能阻碍程序的可靠性和正确性。MFC的常用类有:

1).CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西差不多上一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。该类专门大,一开始也不必学,明白就行了。

2).CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)。

3).CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的确实是它。

4).CDC设备文本。不管是显示器依旧打印机,差不多上画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。

5).CDialog对话框。

6).CWinApp应用程序类。似于C中的main函数,是程序执行的入口和治理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。

7).CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。

8).CPen笔,画线。

9).CBrush刷子,填充。

10).CFont字体,操纵文字输出的字体。

11).CBitmap位图。

12).CPalette调色板。

13).CRgn区域,指定一块区域能够用于做专门处理。

14).CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)。

15).CString字符串。封装了C中的字符数组,专门有用。

16).CPoint点,确实是(x,y)对。

17).CRect矩形,确实是(left,top,right,bottom)。

18).CSize大小,确实是(cx,cy)对(宽、高)。

1.3 本文工作内容

本文的要紧工作为FTP服务器和客户端的设计。其要紧设计内容有:

(1)服务器设计:

●服务器日志模块。

●在线用户模块。

●程序设置模块。

●统计模块。

●安全模块。

(2)客户端设计:

●连接服务器模块。

●上传文件模块。

●下载文件模块。

第2章系统整体设计

本系统的设计为FTP服务器和客户端设计,要紧设计模块分为服务器设计模块和客户端设计模块。服务器设计模块包括:服务器日志模块,在线用户模块,程序设置模块,统计模块,安全模块。客户端设计模块包括:连接服务器模块,上传文件模块,下载文件模块。

2.1 FTP服务器整体设计

服务器设计模块包括:服务器日志模块,在线用户模块,程序设置模块,统计模块,安全模块。其软件设计模块层次图如图2.1所示。

图2.1 FTP 服务器模块设计层次图

Fig. 2.1 FTP server module level design plans

服务器日志模块。服务器日志模块的要紧功能为显示和记录用户的登录信息和一系列的操作信息。例如用户上传文件内容,上传时刻;下载文件内容,下载时刻等等。 在线用户模块。在线用户模块的要紧功能为显示当前连接上服务器的用户。

程序设置模块。程序设置模块的要紧功能为配置服务器参数。例如承诺用户下载,承诺用户上传等一些列用户对服务器的操作参数配置。

统计模块。统计模块的要紧功能为统计历史时刻上,服务器各种操作的总量并显示。例如服务器的总下载量,总上传量,总连接用户数等。

安全模块。安全模块的要紧功能为配置服务器的安全性。要紧配置内容为设置承诺接入服务器的IP 和禁止接入服务器的IP

2.2 FTP 客户端整体设计

客户端设计模块包括:连接服务器模块,上传文件模块,下载文件模块。其软件设计层次图如图2.2所示。

图2.2 FTP 客户端模块设计层次图

Fig. 2.2 FTP client module level design plans

连接服务器模块。连接服务器模块的要紧功能为依照用户输入的用户名、密码、服务器名和连接端口,完成客户端对服务器的接入。

上传文件模块。上传文件模块的要紧功能为扫瞄本地文件,选择上传文件,上传文件到服务器。

下载文件模块。下载文件模块的要紧功能为显示服务器文件名目,依照用户选择下载相应文件,储备到本地机器硬盘上。

第3章FTP服务器模块设计

服务器的要紧设计模块为五个模块:服务器日志模块,在线用户模块,程序设置模块,统计模块,安全模块。

3.1服务器日志模块

服务器日志模块的要紧功能为显示和记录用户的登录信息和一系列的操作信息。其具体显示和记录的日志信息为:用户登录信息;用户上传文件信息;用户下载文件信息;用户设置服务器文件名目信息;用户创建服务器文件名目信息;用户删除服务器文件名目信息;用户修改服务器文件名目信息;用户下线信息。其程序具体设计方法为:当服务器接收到客户端命令信息时,将信息显示在服务器Log信息窗口,并将其记录在文件中。其程序设计流程图如图3.1.1所示。

图3.1.1服务器日志模块设计流程图

Fig. 3.1.1 Server logs modular design flow chart

其服务器日志模块运行界面图如图3.1.2所示

图3.1.2 服务器日志模块运行界面图

Fig. 3.1.2 Server logs module running interface

其设计要紧实现程序代码如下:

AddTraceLine函数的要紧功能为向服务器日志信息显示List控件增加一个元素,用以显示到来的信息。

void CTracePage::AddTraceLine(int nLevel, LPCTSTR pstrFormat, ...)

{

CString str;

// format and write the data we were given

va_list args;

va_start(args, pstrFormat);

str.FormatV(pstrFormat, args);

try

{

// create new message

CLogMsg *pLogMsg = new CLogMsg;

GetLocalTime(&pLogMsg->m_sysTime);

pLogMsg->m_nLevel = nLevel;

pLogMsg->m_strText = str;

m_QueueLock.Lock();

m_LogQueue.AddTail(pLogMsg);

m_QueueLock.Unlock();

// schedule log action

PostMessage(WM_ADDTRACELINE);

}

catch(...)

{

}

}

OnAddTraceLine函数为日志消息响应函数,当服务器器接收到客户端的信息时,向服务器生活模块发送日志消息;生活模块在响应函数OnAddTraceLine中,判定消息的类别,依照其类别设定其消息显示内容和内容显示颜色。

LRESULT CTracePage::OnAddTraceLine(WPARAM, LPARAM)

{

CLogMsg *pLogMsg;

try

{

// get first message in the queue

// m_QueueLock.Lock();

pLogMsg = (CLogMsg *)m_LogQueue.RemoveHead();

// m_QueueLock.Unlock();

switch(pLogMsg->m_nLevel)

{

case 1:

m_TraceList.AddString(pLogMsg->m_strText, RGB(0,130,0));

break;

case 2:

m_TraceList.AddString(pLogMsg->m_strText, RGB(0,0,255));

break;

case 3:

m_TraceList.AddString(pLogMsg->m_strText, RGB(255,0,0));

break;

default:

m_TraceList.AddString(pLogMsg->m_strText, RGB(0,0,0));

break;

}

/* CString strDateTime;

strDateTime.Format("%02d/%02d/%02d %02d:%02d:%02d.%03d ",

pLogMsg->m_sysTime.wDay,

pLogMsg->m_sysTime.wMonth, pLogMsg->m_sysTime.wYear,

pLogMsg->m_sysTime.wHour,

pLogMsg->m_sysTime.wMinute, pLogMsg->m_sysTime.wSecond,

pLogMsg->m_sysTime.wMilliseconds);

switch(pLogMsg->m_nLevel)

{

case 1:

m_LogFile << error_lvl << strDateTime << pLogMsg->m_strText << endl;

break;

case 2:

m_LogFile << warning_lvl << strDateTime << pLogMsg->m_strText << endl;

break;

case 3:

default:

m_LogFile << trace_lvl << strDateTime << pLogMsg->m_strText << endl;

break;

} */

delete pLogMsg;

}

catch(...)

{

// something is wrong...

}

return TRUE;

}

OnSize为生活模块窗口大小改变事件响应函数,当应用程序窗口大小发生改变时,会触发窗口改变事件。在事件响应函数OnSize中,生活模块改变窗口大小,使其和主窗口保持大小比例。

void CTracePage::OnSize(UINT nType, int cx, int cy)

{

CDialog::OnSize(nType, cx, cy);

if (IsWindow(::GetDlgItem(m_hWnd, IDC_TRACE)))

{

CRect rect;

GetClientRect(rect);

// rect.DeflateRect(5,5,10,10);

m_TraceList.MoveWindow(rect);

}

}

void CTracePage::OnTraceClear()

{

m_TraceList.ResetContent();

}

void CTracePage::OnContextMenu(CWnd* pWnd, CPoint point)

{

CMenu menu;

menu.LoadMenu(MAKEINTRESOURCE(IDR_TRACE_MENU));

menu.GetSubMenu(0)->TrackPopupMenu(0, point.x, point.y, this, NULL);

}

3.2 在线用户模块

在线用户模块的要紧功能为显示当前连接上服务器的用户。其显示内容有:用户登录用户名,用户IP,用户登录时刻。显示方法为使用ClistCtrl控件将显示内容显示在其上。

ClistCtrl控件常用操作方法如下。

1)设置ClistCtrl类型。 DWORD SetExtendedStyle(DWORD dwNewStyle);其中 LVS_EX_CHECKBOXES 表示添加CheckBox, LVS_EX_FULLROWSELECT 表示选择整行, LVS_EX_GRIDLINES 表示添加表格线。假如设置了LVS_EX_CHECKBOXES属性,则能够用 BOOL GetCheck( int nItem ) const;来得到某一行是否Checked。

2) 删除操作。BOOL DeleteItem( int nItem),删除指定的元素,nItem为要删除的元素。BOOL DeleteAllItems( ),删除所有的元素。

3) 插入元素操作。int InsertItem( int nItem, LPCTSTR lpszItem),nItem为插入元素索引号,lpszItem为插入元素标签地址。

4)插入列操作。int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int Width = -1, int nSubItem = -1 ),nCol为新列索引号,lpszColumnHeading 列元素存放名称地址。

5)设置列宽操作。BOOL SetColumnWidth( int nCol, int cx ),nCol列所引号,cx设置宽度。

6)设置元素值操作。BOOL SetItemText(int nItem,int nSubItem, LPCTSTR lpszText ),nItem设置元素,nSubItem设置子元素,lpszText值内容地址。

其程序设计流程图如图3.2.1所示。

开始用户登录信息?

增加CtrlList 新元素登录信息正确?

查找用户CtrlList 元素

删除用户CtrlList 元素

用户下线信息结束

N Y

N

Y

Y N

图3.2.1 在线用户模块设计流程图

Fig. 3.2.1 Online user modular design flow chart

在线用户模块运行界面图如图3.2.2所示。

图3.2.2 在线用户模块运行界面图

Fig. 3.2.2 Online user modular running interface

其程序设计要紧实现代码如下:

OnInitDialog()为在线用户模块对话框初始函数,在线用户模块在那个地点为在线用户List 显示控件,增加三个元素:“用户名”,“IP地址”,“登陆时刻”,用来显示登陆用户的信息。BOOL COnlineUsersPage::OnInitDialog()

{

CDialog::OnInitDialog();

m_OnlineUsers.InsertColumn(1, "用户名");

m_OnlineUsers.InsertColumn(2, "IP 地址");

m_OnlineUsers.InsertColumn(3, "登录时刻");

DWORD dwStyle = m_OnlineUsers.GetExtendedStyle();

dwStyle |= LVS_EX_FULLROWSELECT;

m_OnlineUsers.SetExtendedStyle(dwStyle);

return TRUE;

}

AddUser函数为在线用户信息显示List控件,增加元素函数。当有新的用户登录服务器时,在线用户模块调用AddUser函数,显示新的登录用户信息。

void COnlineUsersPage::AddUser(DWORD nThreadID, LPCTSTR lpszName, LPCTSTR lpszAddress)

{

CString strThreadID;

strThreadID.Format("%d", nThreadID);

LVFINDINFO info;

info.flags = LVFI_PARTIAL|LVFI_STRING;

info.psz = (LPCTSTR)strThreadID;

int nIndex = m_OnlineUsers.FindItem(&info);

if (nIndex == -1)

{

nIndex = m_OnlineUsers.InsertItem(0, strThreadID);

}

m_OnlineUsers.SetItemText(nIndex, 1, lpszName);

m_OnlineUsers.SetItemText(nIndex, 2, lpszAddress);

m_OnlineUsers.SetItemText(nIndex, 3, CTime::GetCurrentTime().Format("%H:%M:%S"));

}

RemoveUser函数为在线用户信息显示List控件,删除元素函数。当有用户下线时或则断开服务器连接时,在线用户模块调用RemoveUser函数,删除相应的登录用户信息。

void COnlineUsersPage::RemoveUser(DWORD nThreadID)

{

LVFINDINFO info;

CString strThreadID;

strThreadID.Format("%d", nThreadID);

info.flags = LVFI_PARTIAL|LVFI_STRING;

info.psz = (LPCTSTR)strThreadID;

int nIndex = m_OnlineUsers.FindItem(&info);

if (nIndex != -1)

{

m_OnlineUsers.DeleteItem(nIndex);

}

}

3.3 程序设置模块

程序设置模块的要紧功能为配置服务器参数。其配置参数有:FTP连接端口,最大用户连接数,服务器开启方式,服务器系统信息,Log文件查看和清除。其程序设计方法为:系统时刻监控程序设置模块,当程序设置模块触发应用消息时,系统重新读入配置信息;当程序设置模块触发查看Log信息时,打开Log文件;当程序设置模块触发清除Log信息时,清空Log文件。其程序流程图如图3.3.1所示。

图3.3.1 程序设置模块设计流程图

Fig. 3.3.1 Procedures settings modular design flow chart

程序设置模块运行界面图如图3.3.2所示。

图3.3.2 程序设置模块运行界面图

Fig. 3.3.2 Procedures settings modular running interface

其程序设计要紧实现实现代码如下:

OnDestroy函数为程序设置模块销毁函数。当主程序退出时,销毁程序设置模块,现在程序设置模块调用OnDestroy函数读取配置参数,并将其写入配置文件中储备。

void CConfigurationPage::OnDestroy()

{

UpdateData();

// save settings

AfxGetApp()->WriteProfileInt("Settings", "Port", m_nPort);

AfxGetApp()->WriteProfileInt("Settings", "MaxUsers", m_nMaxUsers);

AfxGetApp()->WriteProfileInt("Settings", "Timeout", m_nTimeout);

AfxGetApp()->WriteProfileString("Settings", "WelcomeMsg", m_strWelcomeMessage);

AfxGetApp()->WriteProfileString("Settings", "GoodbyeMsg", m_strGoodbyeMessage);

AfxGetApp()->WriteProfileInt("Settings", "LaunchOnStartup", m_bLaunchOnStartup);

AfxGetApp()->WriteProfileInt("Settings", "StartInTray", m_bStartInTray);

AfxGetApp()->WriteProfileInt("Settings", "AutoActivate", m_bAutoActivate);

AfxGetApp()->WriteProfileInt("Settings", "LogLevel", m_nLogLevel);

AfxGetApp()->WriteProfileString("Settings", "AppName", m_strApplicationName);

CDialogResize::OnDestroy();

}

OnView()函数为程序设置模块的日志文件查看函数。当用点击查看日志按钮时,程序设置模块调用OnView()函数打开日志文件。

void CConfigurationPage::OnView()

{

int ExecStatus = (UINT)ShellExecute(m_hWnd, "open", "NOTEPAD.EXE", (LPCTSTR)theApp.m_LogFile.m_FileName, 0, SW_SHOW);

switch(ExecStatus)

{

case 0:

MessageBox("Systeem is out of Memory","ShellExecute Error",MB_OK |

MB_ICONEXCLAMATION);

break;

case 2:

MessageBox("'NOTEPAD.EXE' is not found !","ShellExecute Error",MB_OK | MB_ICONEXCLAMATION);

break;

default:

if (ExecStatus <= 32)

MessageBox("Problem with executing of NOTEPAD.EXE","ShellExecute Error",MB_OK | MB_ICONEXCLAMATION);

break;

}

}

OnClear()函数为程序设置模块的日志文件清空函数。当用点击查看日志按钮时,程序设置模块调用OnClear()函数清空日志文件。

void CConfigurationPage::OnClear()

{

theApp.m_LogFile.Clear();

}

OnApply()函数为程序设置模块程序设置参数储备函数。不同的是,该函数会向主程序发送程序设置参数改变消息,使主程序重新读取配置参数。当用户修改完程序设置参数后,点击应用按钮后,程序设置模块调用OnApply()函数使新设置参数生效。

void CConfigurationPage::OnApply()

{

m_bModified = FALSE;

UpdateDialogControls(this, FALSE);

AfxGetMainWnd()->SendMessage(WM_COMMAND, IDC_APPLY);

// save settings

AfxGetApp()->WriteProfileInt("Settings", "Port", m_nPort);

AfxGetApp()->WriteProfileInt("Settings", "MaxUsers", m_nMaxUsers);

AfxGetApp()->WriteProfileInt("Settings", "Timeout", m_nTimeout);

AfxGetApp()->WriteProfileString("Settings", "WelcomeMsg", m_strWelcomeMessage);

AfxGetApp()->WriteProfileString("Settings", "GoodbyeMsg", m_strGoodbyeMessage);

AfxGetApp()->WriteProfileInt("Settings", "LaunchOnStartup", m_bLaunchOnStartup);

AfxGetApp()->WriteProfileInt("Settings", "StartInTray", m_bStartInTray);

AfxGetApp()->WriteProfileInt("Settings", "AutoActivate", m_bAutoActivate);

AfxGetApp()->WriteProfileInt("Settings", "LogLevel", m_nLogLevel);

AfxGetApp()->WriteProfileString("Settings", "AppName", m_strApplicationName);

}

3.4 统计模块

统计模块的要紧功能为统计历史时刻上,服务器各种操作的总量并显示。其统计参数有:总连接用户数,当前在线用户数,文件下载数,文件上传数,文件下载失败数,文件上传失败数,下载文件总量,上传文件总量。其设计方法为:当有用户登录成功后,加一总连接用户数,加一在线用户数;当有用户下线时,减一在线用户数;当有用户下载文件时,加一文件总下载数,下载文件总量加上下载文件大小,假如下载失败,加一下载失败总数;当有上传文件时,加一上传文件总数,上传文件总量加上上传文件大小,假如上传失败,加一上传文件失败总数。其程序设计流程图如图3.4.1所示。

图3.4.1 统计模块程序设计流程图

Fig. 3.4.1Statistics module design process flow chart 其统计模块运行界面图如图3.4.2所示。

本文来源:https://www.bwwdw.com/article/e5de.html

Top