FTP实现断点上传下载功能

项目需求需要实现一个断点上传功能,本来想利用Socket通信手动去实现此功能。但是由于时间过于短暂,故而采取ftp的方式进行文件的上传与下载。但是在开发板上默认的工具:ftpput与ftpget是不支持ftp的断点上传下载功能的。从busybox官网下载源代码,在/busybox-1.22.1/busybox-1.22.1/networking目录下找到BusyBox中的源代码中ftpgetput.c,找到ftp_send函数如下:

static int ftp_send(const char *server_path, char *local_path)
{
	int fd_data;
	int fd_local;
	int response;

	/* connect to the data socket */
	fd_data = xconnect_ftpdata();

	/* get the local file */
	fd_local = STDIN_FILENO;
	if (NOT_LONE_DASH(local_path))
		fd_local = xopen(local_path, O_RDONLY);

	response = ftpcmd("STOR", server_path);
	switch (response) {
	case 125:
	case 150:
		break;
	default:
		ftp_die("STOR");
	}

	return pump_data_and_QUIT(fd_local, fd_data);
}

看到其往服务器端传输数据采取的方式是“STOR”的形式。查看FTP协议文档可知,此命令使服务器DTP接收数据连接上传送过来的数据,并将数据保存在服务器的文件中。如果文件已存在,原文件将被覆盖。如果文件不存在,则新建文件。

再看另一个FTP命令“APPE “,从字面意思可以看出来是追加的意思。它和“STOR”的功能差不多,但是如果服务器中文件在指定路径内文件已存在,则把数据附加到原文件尾部,如果不存在则新建文件。

 所以这里,我们采用“APPE”的模式,这样可以实现断点上传。将ftp_send函数中的“STOR”全部替换成“APPE”。这样改写后的ftpput可以实现断点上传。

 

     断点下载的过程与上传到过程相反。首先获取本地已经存在的文件大小,然后发送“REST”到服务器告诉文件的偏移量,再发送“RETR”命令,下载文件,以追加模式写入本地文件中。

    ftp服务器支持两种下载模式:主动模式与被动模式。所谓的主动模式就是客户端的上传或下载数据通道是通过服务器以主动连接客户端的方式建立的;而被动模式相反,数据通道是客户端主动连接服务器端建立的。两种工作模式主要是为了穿越防火墙,比如客户端安装了防火墙,因此外部进入的连接请求一般会被拒绝,这时候就不能选择主动模式下载或者上传,而应该采用被动模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值