使用 Socket 通信实现 FTP 客户端程序

2015-01-18 09:59:35|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

客户端通过 PORT 命令告诉服务器连接自己的 p1*256+p2 端口。随后在这个端口进行监听,等待 FTP 服务器连接上来, 再通过这个数据端口来传输文件。PORT 方式在传送数据时,FTP 客户端其实就相当于一个服务器端,由 FTP 服务器主动连接自己。

断点续传

由于网络不稳定,在传输文件的过程中,可能会发生连接断开的情况,这时候需要客户端支持断点续传的功能,下次能够从上次终止的地方开始接着传送。需要使用命令 REST。如果在断开连接前,一个文件已经传输了 512 个字节。则断点续传开始的位置为 512,服务器会跳过传输文件的前 512 字节。

清单 8. FTP 服务器断点续传下载文件

//... ...

/* 命令 ”REST offset
” */

sprintf(send_buf,"REST %ld
", offset);

/* 客户端发送命令指定下载文件的偏移量 */

write(control_sock, send_buf, strlen(send_buf));

/* 客户端接收服务器的响应码和信息,

*正常为 ”350 Restarting at <position>. Send STORE or RETRIEVE to initiate transfer.” */

read(control_sock, read_buf, read_len);

... ...



/* 命令 ”RETR filename
” */

sprintf(send_buf,"RETR %s
",filename);

/* 客户端发送命令从服务器端下载文件, 并且跳过该文件的前offset字节*/

write(control_sock, send_buf, strlen(send_buf));

/* 客户端接收服务器的响应码和信息,*

*正常为 ”150 Connection accepted, restarting at offset <position>” */

read(control_sock, read_buf, read_len);

//... ...

file_handle = open(disk_name, CRFLAGS, RWXALL);

/* 指向文件写入的初始位置 */

lseek(file_handle, offset, SEEK_SET);

//... ...

结束语

本文从应用实现的角度,介绍了 FTP 协议。并用详尽的例子分析了如何用主动模式和被动模式实现 FTP 客户端上传下载文件,如何进行断点续传。通过本文可以让读者对 FTP 客户端的原理有一个深入的了解。

本文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/

发表评论0条 】
网友评论(共?条评论)..
使用 Socket 通信实现 FTP 客户端程序