肖雪冬 辽宁锦州渤海大学信息科学与技术学院
Linux系统的文件传送实现
肖雪冬 辽宁锦州渤海大学信息科学与技术学院
本文实现Linux系统下的FTP文件传输系统。系统实现分为客户端和服务器端,客户端具有用户登录、目录查看、上传文件、下载文件等功能。服务器端具有查询客户端命令、处理客户端命令和文件处理等功能,实现工具为C语言。客户端应用了套接字编程并通过定义ftpcmd结构体,完成了文件的传输。
Linux系统 FTP 客户端文件传输
Internet技术飞速发展,推动了全球范围内信息的传输、交流和共享。海量的数据、软件分布在世界各地,人们只需输入信息,就能得到大量所需要的资源信息,文件传输是为其实现提供了重要方法。FTP(File Transfer Protocol, FTP)文件传输系统是最常用的文件传输方式,不同系统下的FTP文件传送均有实现,特别是基于windows系统。相对于windows系统,Linux系统具有开源和自由传播等优点,有着广泛的应用前景。
文件传送是因特网中的一项重要应用,为广大用户提供了实时传送非页面的途径。FTP文件传输协议是Internet最原始最重要的协议之一,虽然目前www已经取代了FTP的很多功能,如软件下载,文件传输等等。但通过Internet从客户向服务器传输文件时,仍然还在使用FTP。因为互联网上各种各样的软件资源都是放在FTP服务器中的,而且这也是网上文件传输最好的方式。同样在局域网上也可以建立FTP服务,以满足局域网文件传输和资源共享的需要。随着网络用户的增加,对文件传送功能的要求也越来越多,为了满足用户各有特色的需要,通用的文件传送协议如FTP、TFTP和NFS等遇到了问题,特别是Linux系统下为提供安全性、可靠性高的文献传送,需要设计独有的文件发送和接收程序。
本次课题的设计是实现一个采用C/S结构的FTP系统,所选用的设计平台在上一章中我们进行了比较详细的介绍,在这一章我们将对FTP系统需要完成的目标、功能需求、性能需求做出进一步的说明,并对整个C/S结构系统进行总体的设计。
文件传送功能的实现主要包括:获取磁盘信息,获取目录信息,获取文件信息,运行指定文件,删除指定文件,删除指定目录,创建指定目录,上传下载文件,获取远程文件图标。
本次课题的FTP系统的功能需求主要包括:
①实现文件的传送,在设计中我们应用C/S模型分别对用户的下载要求和上传要求进行编程实现。采用的是一对一的传输模型,当客户端输入下载或者上传命令后,客户端能够作出正确的响应并可以成功将文件下载到客户端或者将文件上传到服务器。
②FTP系统的用户登录验证,众所周知,在Internet环境下进行数据传输,我们很多情况下都需要提供自己的登录名和密码,才能实现相关的操作,这个要求既是区分等级,判定用户权限的好方法,也是保护隐私的一种必要操作。本次设计的FTP系统设计的是权限用户,用户想要连接上服务器,则必须输入对应的用户名和密码。才能进行文件传输的有关操作。
③FTP系统的目录查看,目录查看功能能够直观化的知道文件夹中包含哪些内容,方便对其进行操作和管理。
FTP模型的结构一般由服务器端和客户端两部分所构成,本文研究的FTP文件传输系统是由Linux系统下的FTP服务器和客户端构成,在这一章将着重研究该环境下FTP客户端和服务器的设计实现。本章的设计实例中,客户端和服务器工作在同一台电脑上,因此FTP服务器采用的是本地IP地址127.0.0.1。
3.1 FTP客户端设计实现
FTP客户端工作流程如下:
①首先创建一个客户端控制连接套接字。
②创建init函数对数据进行初始化,将FTP数据命令设置为被动模式。
③客户端向服务器发起控制连接,调用login函数登陆FTP服务器,服务器验证用户名和用户密码。
④客户端登陆服务器,客户端输入命令,服务器调用check_ ftpcmd函数对命令进行合法性检查,并解析该命令和该命令所需参数。
⑤命令验证正确,向服务器发送该命令,调用get_ftpcmd_ status函数接收服务器应答状态。
⑥服务器处理客户端命令。
⑦关闭连接。
系统登录成功后,先进行目录查看。文件目录列表是指用户请求查看在服务器当前目录下的文件列表,服务器响应该查询请求,并将该文件列表以目录形式传送回客户端,程序设计中编写了函数do_list_pasv(intfd,charcmd,charargs)来实现被动模式下在客户端查看服务器目录功能。
①调用pasv_notify(fd)函数,客户端向服务器发出PASV命令,客户端通过make_conn(port_pasv)函数主动连接到ftp服务器。
②客户端发送ls命令请求查看服务器目录,调用send_ ftpcmd(fd, cmd, args)函数将传入的ls命令和命令参数构造成FTP协议命令字的形式发给FTP服务器,然后客户端调用get_ ftpcmd_status(fd, res_buffer)函数获得服务器的应答信息和应答状态status。
③调用list_flies(sockfd_pasv)函数实现在客户端显示服务器目录。
程序中用for循环和read()函数读取数据
④关闭数据连接。
建立FTP数据连接的前提是控制连接己经正确建立,FTP的客户身份验证需要在控制连接的引导下才能完成,程序设计中我们定义了login(host,port)函数,它的主要功能是在启动客户端程序时,登录FTP服务器。首先客户端先与服务器建立数据连接,客户端向服务器发送get(下载)命令,客户端通过控制连接读取到服务器的正确应答命令,然后服务器开始执行下载命令,将文件在服务器下载到客户端对应的目录下,文件下载完成后关闭连接。程序设计中编写了函数do_get_pasv(int fd, char cmd,char args)来实现被动模式下客户端从服务器下载文件。
①调用pasv_notify(fd)函数创建被动模式下的监听套接字,客户端通过make_conn(port_pasv)函数主动连接到ftp服务器。
②客户端发送get命令请求从服务器下载文件,调用send_ ftpcmd(fd, cmd, args)函数将传入的get命令和命令参数构造成FTP协议命令字的形式发给FTP服务器,然后客户端调用get_ ftpcmd_status(fd, res_buffer)函数获得服务器的应答信息和应答代码status。
③调用download_flie(fp, res_buffer)函数实现从当前本地目录中进行上载文件的处理。
④关闭数据连接。
重置data_flag标志位为0。其中get指令代表从服务器下载文件到客户端,/home/lzj/service代表要下载文件的路径,download代表要下载的文件。第二个download代表把下载的文件保存到本地的名称。
3.2 服务端设计实现
服务器程序的最终编译结果放home/lzj/simple-ftp-master这个路径下的,输入/home/lzj/simple-ftp-master/myftpd/ home/lzj/service/ 8888开启服务器。其中,myftpd代表服务器名称,home/lzj/service/表示服务器的当前工作路径,上传到服务器的文件将存放在这个路径下,8888是服务器开启的用来传输数据的端口。
服务器端首先建立一个socket(),设置好本地的IP和端口与socket进行绑定,开始监听请求。当服务器接收到客户端连接请求后,发送确认,同客户端建立连接,客户端建立一个socket(),设置好服务器端的IP和提供服务器的端口,发送连接请求,当接收到服务器确认后,进行连接,客户端开始与服务器进行通信。处理客户端发送的各种命令。
具体实现过程如下:
①创建服务端地址。
②本地套接字绑定IP地址及端口号。
③监听客户端发起的连接请求。
④接收客户端发起连接请求。
⑤通过service_loop函数查询客户端命令。
⑥通过service_handleCmd函数处理客户端命令。
FTP服务器创建函数完成对FTP客户端命令的处理,并进行客户端与服务器端的交互。这里我们引入函数service_handleCmd( int a_socket, String *ap_argv,const int a_argc)处理客户需求,从客户端连接成功开始到结束服务。
FTP服务器当收到客户端需要进行数据传输的请求时,建立新的套接字进行数据传输,实现文件的上传下载操作。在这里我们引入函数void handle file(int client sock)处理文件功能。这里依然是用套接字编程实现的。
本文通过Linux操作系统下的FTP协议分析,完成了系统文件传输功能。我们通过程序设计实现了一个完整标准的LINUX下的FTP服务器和客户端文件传输系统,具有一定的学习意义和实际应用价值。
[1]蔡勇.FTP服务器技术研究及实现[M].成都:电子科技大学,2005
[2][美]Kurose,J.F等著.计算机网络:自顶向下方法与Internet特色(原书第3版)[M].北京:机械工业出版社.2005.6
[3][美]Richard Stevens,范建华译.TCP/IP详解[M].北京:机械工业出版社.2000.4
[4]刘晨.被忽视的FTP网络信息资源[J].网络纵横,2001,(4):89-90
[5]王大亮,曾广平.张德政.UBUNTU标准教程[M].北京:人民邮电出版社.2008.5