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/