使用Socket实现FTP客户端程序

上传人:公**** 文档编号:507742799 上传时间:2023-03-30 格式:DOCX 页数:19 大小:269.28KB
返回 下载 相关 举报
使用Socket实现FTP客户端程序_第1页
第1页 / 共19页
使用Socket实现FTP客户端程序_第2页
第2页 / 共19页
使用Socket实现FTP客户端程序_第3页
第3页 / 共19页
使用Socket实现FTP客户端程序_第4页
第4页 / 共19页
使用Socket实现FTP客户端程序_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《使用Socket实现FTP客户端程序》由会员分享,可在线阅读,更多相关《使用Socket实现FTP客户端程序(19页珍藏版)》请在金锄头文库上搜索。

1、使用Socket通信实现FTP客户端程序FTP概述文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。 FTP的目标是提高文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收 到命令后给予响应,并执行命令。FTP协议与操作系统无关,任何操作系统上的程序只要 符合FTP协议,就可以相互传输数据。本文主要基于LINUX平台,对FTP客户端的实 现原理进行详尽的解释并阐述如何使用C语言编写一个简单的FTP客户端。FTP协议相比其他协议,如HTTP协议,FTP协议要复杂一些。与一般的C/S应用不同点在于一 般的

2、C/S应用程序一般只会建立一个Socket连接,这个连接同时处理服务器端和客户端 的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般 是21 (命令端口)和20 (数据端口)。控制Socket用来传送命令,数据Socket是 用于传送数据。每一个FTP命令发送之后,FTP服务器都会返回一个字符串,其中包括 一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。命令端口一般来说,客户端有一个Socket用来连接FTP服务器的相关端口,它负责FTP命令的 发送和接收返回的响

3、应信息。一些操作如登录”、“改变目录”、“删除文件”,依靠这个连接发 送命令就可完成。数据端口对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个 Socket来完成。如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个Socket来 连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器 需要连接到客户端开启的这个数据端口,并进行数据的传输。下面对FTP的主动模式和被动模式做一个简单的介绍。主动模式(PORT)主动模式下,客户端随机打开一个大于1024的

4、端口向服务器的命令端口 P,即21端口, 发起连接,同时开放N +1端口监听,并向服务器发出“port N+1”命令,由服务器从它自 己的数据端口(20)主动连接到客户端指定的数据端口(N+1)。FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客 户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。被动模式(PASV)为了解决服务器发起到客户的连接问题,有了另一种FTP连接方式,即被动方式。命令连 接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙 过滤的问题。被动模式下,当开启一个FTP连接时,客户端打开两个任意的本地端口 (N

5、 1024和 N+1)。第一个端口连接服务器的21端口,提交PASV命令。然后,服务器会开启一个任意的端 口(P 1024 ),返回如 “227 ent ering passive mode (127,0,0,1,4,18)它返回了 227 开 头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数 第二个乘256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端 口。如得到 227 entering passive mode (h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2, ip地址为h1.h2.h3.h4。这意味着在服务器上

6、有一个端口被开放。客户端收到命令取得端口 号之后,会通过N+1号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。主要用到的FTP命令FTP每个命令都有3到4个字母组成,命令后面跟参数,用空格分开。每个命令都以 rn结束。要下载或上传一个文件,首先要登入FTP服务器,然后发送命令,最后退出。这个过程中, 主要用至I的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。USER:指定用户名。通常是控制连接后第一个发出的命令。“USER gaoleyirn”:用户名 为gaoleyi登录。PASS:指定用户密码。该命令紧跟USER命令后。“PAS

7、S gaoleyirn”:密码为gaoleyi。SIZE:从服务器上返回指定文件的大小。“SIZE file.txtrn”:如果file.txt文件存在,则返回 该文件的大小。CWD:改变工作目录。如:“CWD dirnamern”。PASV:让服务器在数据端口监听,进入被动模式。如:“PASVrn”。PORT:告诉FTP服务器客户端监听的端口号,让FTP服务器采用主动模式连接客户端。 如:“PORT h1,h2,h3,h4,p1,p2”。RETR:下载文件。“RETR file.txtrn”:下载文件 file.txt。STOR:上传文件。“STOR file.txtrn”:上传文件 fil

8、e.txt。REST:该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传 输的FTP命令。“REST 100rn”:重新指定文件传送的偏移量为100字节。QUIT:关闭与服务器的连接。FTP响应码客户端发送FTP命令后,服务器返回响应码。响应码用三位数字编码表示:第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。第二个数字是响应类型的分类,如2代表跟连接有关的响应,3代表用户认证。第三个数字提供了更加详细的信息。第一个数字的含义如下:1表示服务器正确接收信息,还未处理。2表示服务器已经正确处理信息。3表示服务器正确接收信息,正在处理。4表示信息暂时错误。5

9、表示信息永久错误。第二个数字的含义如下:0表示语法。1表示系统状态和信息。2表示连接状态。3表示与用户认证有关的信息。4表示未定义。5表示与文件系统有关的信息。Socket编程的几个重要步骤Socket客户端编程主要步骤如下:1. socket()创建一个 Socket2. connect()与服务器连接3. write()和read()进行会话4. close()关闭 SocketSocket服务器端编程主要步骤如下:1. socket()创建一个 Socket2. bind()3. listen()监听4. accept()接收连接的请求5. write()和read()进行会话6. cl

10、ose()关闭 Socket实现FTP客户端上传下载功能下面让我们通过一个例子来对FTP客户端有一个深入的了解。本文实现的FTP客户端有 下列功能:1. 客户端和FTP服务器建立Socket连接。2. 向服务器发送USER、PASS命令登录FTP服务器。3. 使用PASV命令得到服务器监听的端口号,建立数据连接。4. 使用RETR/STOR命令下载/上传文件。5. 在下载完毕后断开数据连接并发送QUIT命令退出。本例中使用的FTP服务器为filezilla。在整个交互的过程中,控制连接始终处于连接的状 态,数据连接在每传输一个文件时先打开,后关闭。客户端和FTP服务器建立Socket连接当客户

11、端与服务器建立连接后,服务器会返回220的响应码和一些欢迎信息。图1.客户端连接到服务器端接到FTP服务器,接收欢迎信息SOCKET control_sock;struct hostent *hp;struct sockaddr_in server;memset(&server, 0, sizeof(struct sockaddr_in);/* 初始化 socket */control_sock = socket(AF_iNET, sock_stream, 0);hp = gethostbyname(server_name);memcpy(&server.sin_addr, hp-h_addr

12、, hp-h_length); server.sin_family = AF_INET;server.sin_port = htons(port);/*连接到服务器端*/connect(control_sock,(struct sockaddr *)&server, sizeof(server);/*客户端接收服务器端的一些欢迎信息*/read(control_sock, read_buf, read_len);客户端登录FTP服务器当客户端发送用户名和密码,服务器验证通过后,会返回230的响应码。然后客户端就可 以向服务器端发送命令了。图2.客户端登录FTP服务器T Tim已Eend()US

13、E尺 username r nr:recvQiendQPASS password r ti:recvQ清单2.客户端发送用户名和密码,登入FTP服务器/* 命令USER usernamern */sprintf(send_buf,USER %srn,username);/*客户端发送用户名到服务器端*/write(control_sock, send_buf, strlen(send_buf);/*客户端接收服务器的响应码和信息,正常为331 User name okay, need password. */ read(control_sock, read_buf, read_len);/*

14、命令PASS passwordrn */sprintf(send_buf,PASS %srn,password);/*客户端发送密码到服务器端*/write(control_sock, send_buf, strlen(send_buf);/*客户端接收服务器的响应码和信息,正常为230 User logged in, proceed. */ read(control_sock, read_buf, read_len);客户端让FTP服务器进入被动模式当客户端在下载/上传文件前,要先发送命令让服务器进入被动模式。服务器会打开数据端 口并监听。并返回响应码227和数据连接的端口号。图3.客户端让

15、服务器进入被动模式清单3.让服务器进入被动模式,在数据端口监听/* 命令 ”PASVrn” */sprintf(send_buf,PASVrn);/*客户端告诉服务器用被动模式*/write(control_sock, send_buf, strlen(send_buf);/*客户端接收服务器的响应码和新开的端口号,* 正常为227 Entering passive mode () */ read(control_sock, read_buf, read_len);客户端通过被动模式下载文件当客户端发送命令下载文件。服务器会返回响应码150,并向数据连接发送文件内容。图4.客户端从FTP服务器端下载文件清单4.客户端连接到FTP服务器的数据端口并下载文件/*连接服务器新开的数据端口 */connect(data_sock,(struct sockaddr *)&server, sizeof(server);/* 命令CWD dirnamern */spri

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号