服务器设计说明书文档格式.docx
《服务器设计说明书文档格式.docx》由会员分享,可在线阅读,更多相关《服务器设计说明书文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
1)类定义4
2)主要类接口5
2.1CAlienFTPServerDlg类5
2.2AlienFTPServerCmd类5
3)线程定义6
五、功能模块设计7
1)总体流程7
2)新建用户8
3)侦听、启动连接8
4)命令控制和响应模块10
六、小结13
AlienFTP服务器端设计说明书
方超061221021
单梦凡061221016
1、概述
FTP作为文件传输协议(FileTransferProtocol),其任务务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联系的方式、以及使用的操作系统无关。
FTP采用“客户机/服务器”方式,客户端要在自己的本地计算机上安装FTP客户程序,而服务器端则提供远程的访问和文件传输。
针对FTP的服务器端来说,主要为用户和管理员提供访问权限,并通过侦听端口以随时响应合法的客户请求。
通过控制通道和数据通道分别控制和响应对应的相关请求以及进行所需的数据文件传输。
响应的基本指令同标准的FTP协议规范以做到兼容现行的FTP客户端软件(如Flashxp等),同时主要要保证同本组对应的FTP客户端程序相兼容,确保其正确性和可扩展性。
基于服务器端的功能和特点,需要保证能够对端口进行实时侦听,及时响应客户端发送的命令,并由此打开控制通道,等待客户端用户的命令再做对应处理,开放数据通道进行信息和文件等数据的传输。
服务器需要能够对用户进行认证并对命令做出及时准确的回应,满足传输等需求。
由此在设计实现服务器端时,要能够建立一定的客户访问机制,设置权限,针对不同的用户确定相应的处理机制以实现“合法”的访问传输,更重要的一点是正确地解析来自客户端发出的请求命令,给予实时同时需准确无误地响应。
要在客户端完成登陆,退出,列目录,下载/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传等操作的基础上针对每个操作的对应命令做出回复完成合法用户所需的功能。
2、开发目标
设计并实现一个符合标准FTP协议规范的,并支持拥有登陆,退出,列目录,下载/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传以及传输过程中状态计算等功能的对应FTP客户端系统和兼容有同样功能的现行FTP客户端软件。
二、参考文档
《协议说明书》(我们的前期文档)
《VisualC++6.0网络及Internet开发指南》
《VisualC++网络程序设计实例详解》
《VisualC++网络高级编程》
三、开发工具和平台
基于VisualC++6.0的SOCKET网络编程,在WindowsXPSP3下开发完成。
由于近阶段一直在使用VC6.0完成相关实习,并需要同客户端兼容,就决定采用VC6.0下的MFC支持SOCKET进行FTP的开发。
四、测试工具
由于并行开发和需要兼容现行FTP的缘故,为方便测试,采用Flashxp作为客户端软件调试,当然后期主要是直接同本组客户端进行连接测试。
5、程序结构
1)类定义
class
specification
CAlienFTPServerDlg
主对话框类,用于图形界面的处理,通过调用AlienFTPServerCmd类提供的函数实现支持客户端的请求并做出响应。
AlienFTPServerCmd
FTP命令处理类,该类主要负责实现功能需求的各种函数,供CAlienFTPServerDlg直接调用,同时也提供一些基本操作使CAlienFTPServerDlg可以通过这些操作的组合完成复杂的功能。
几乎所有的响应指令都是通过该类完成。
CAlienFTPServer
对应的工程类,基本没有完成相关操作
Adduser
用于增加用户的对话框类,实际中应由管理员进行分配,使用户在持有用户名和密码的情况下访问FTP服务器,同时也支持匿名登陆。
2)主要类接口
2.1CAlienFTPServerDlg类
classmember
function
OnStart
用于侦听客户端的请求以开启服务器的相关服务,它调用ThreadStart的线程处理该操作。
OnViewpath
用于浏览选择对应主机上的文件夹路径供用户访问,它同服务器端和客户端其它处理相同类型的操作所采用的方式基本相同。
OnAddUser
该功能比较简单,主要是跳出增加用户的对话框以设置相关信息,主要功能实现还是在AlienFTPServerCmd中。
2.2AlienFTPServerCmd类
该类完成的操作较为复杂,几乎所有服务器的处理工作都由它完成,故只针对部分进行介绍。
AddUser
增加访问服务器的用户操作,并将信息记录在Usernode的结构体中。
GetUserListHead
得到用户列表中的第一个用户信息(主要是用户名),其它如GetUserListLast等函数功能与之类似。
GetUserLogin
得到当前登陆的用户信息(用户名),其它如GetUserPasswd其功能和结构与之相似
GetUserStartDir
得到对应的用户登陆的根目录信息
StartListening
开启端口进行侦听,相应的StopListening则为结束侦听
IsListening
确定当前服务器是否处于Listening状态
StartAccepting
允许客户端接入服务器进行相应操作
SendReply
服务器对客户端相应命令作出的响应
CloseSocket
关闭套接字
BuildPath
根据客户的起始路径和控制构造相应路径
LIST_Command
处理客户端List等命令的功能
STOR_Command
处理客户端Stor等命令的功能
OpenDataConnection
因数据传输打开数据通道
3)线程定义
Thread
ThreadStart
用于开启服务器响应服务时为其开辟的线程以防止服务器在忙于侦听和处理客户端请求时,无法响应其他的界面处理等操作。
5、功能模块设计
1)总体流程
服务器会先与客户端进行连接,一旦验证和连接成功完成后,服务器和客户端就会打开相关通道进行数据传送等操作。
2)新建用户
通过增加用户以允许合法的客户能够通过客户端成功连接服务器以获取所需信息和数据。
主要为用户创建以下信息:
用户名、登录密码及登录的初始根目录。
通过将信息加入UserNode的结构中记录可以访问的用户。
通过在Adduser类中调用AlienFTPServerCmd中的AddUser函数来实现,把相应账户、密码和路径通过参数传递,用AlienFTPServerCmd的对象ftpserver来通过AddUser完成,将User信息存入UserNode中。
如下:
AlienFTPServerCmd:
:
UserNode*FtpUser=(*ftpserver).AddUser(m_username,m_password,m_userpath);
3)侦听、启动连接
(以上结构同客户端)
新建用户后,通过开启服务,服务器端会对21端口进行不断侦听,当有相应客户端请求时,就会打开命令通道,当有数据传送时,再通过数据通道进行数据连接以传输文件等。
该功能如以上所说,通过在主对话框类ALienFTPServerDlg调用OnStart,并使用线程ThreadStart来实现侦听和连接。
以下为OnStart()函数:
voidCALienFTPServerDlg:
OnStart()//开启服务器
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
//更新在主对话框上得到的数据
pThreadStart=(HANDLE)_beginthreadex(NULL,
0,
ThreadStart,
(void*)this,
0,
&
m_dwID);
}
4)命令控制和响应模块
FTP协议模型
如第五部分介绍,整个服务器部分的主要命令控制和相应控制都在AlienFTPServerCmd类中实现,因此它是整个FTP的关键部分,而主要的处理命令都在一个while
(1)的“死”循环中执行,通过对每个列出的命令如"
USER"
"
PASS"
MODE"
TYPE"
CWD"
PWD"
等进行对应的处理,并利用pszCmd和SendReply传送客户端的请求指令和服务器端的响应,为了清晰准确地反映执行过程的指令传送和响应结果,利用一个字符串str记录pszCmd和SendReply信息并在服务器主对话框上显示,以下是处理命令控制的while循环部分操作:
//主循环,不停地接受客户端发出的命令进行响应
while
(1){
。
。
CFtpServerEx->
str1=pszCmd;
//用str1记录pszCmd的信息,即客户端的请求命令
if(!
strcmp(pszCmd,"
QUIT"
)){
CFtpServerEx->
SendReply(Client,"
221Goodbye.\r\n"
);
//SendREply进行相应的处理表示
break;
}elseif(!
if(Client->
bIsLogged==true){
Client->
bIsLogged=false;
User->
SClient+=-1;
User=NULL;
}
if(!
pszCmdArg){
CFtpServerEx->
501Invalidnumberofarguments.\r\n"
}else{
if(CFtpServerEx->
bAllowAnonymous&
&
!
strcasecmp(pszCmdArg,"
anonymous"
)//处理匿名登录的情况
&
AnonymousUser)
{
Client->
bIsLogged=true;
bIsAnonymous=true;
CFtpServerEx->
230UserLoggedIn.\r\n"
User=CFtpServerEx->
AnonymousUser;
}else{
User=CFtpServerEx->
SearchUserFromName(pszCmdArg);
if(Client->
User&
Client->
bIsEnabled==false)
Client->
331Passwordrequiredforthisuser.\r\n"
}
continue;
)){//处理PASS指令
bIsAnonymous){
}else
6、小结
开始处理SOCKET网络编程时,确实无从着手,而且对MFC这一块很陌生,所以只好完成一些简单的基于对话框的操作,通过一定的适应逐渐了解相关方面的知识,应用也稍加点熟练。
毕竟是对SOCKET等方面的知识了解不够,最初只能通过相关实例来了解具体问题的应用和相关网络编程方面的知识。
总体来说,通过FTP的实现更加深了对网络协议尤其是FTP传输协议的了解,从而从深层次掌握相关方面的知识和应用。