2015-01-18 09:59:35|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
在传输多个文件的过程中,需要注意的是每次新的传输都必须重新使用 PASV 获取新的端口号,接收完数据后应该关闭该数据连接,这样服务器才会返回一个 2XX 成功的响应。然后客户端可以继续下一个文件的传输。
上传文件与下载文件相比,登入验证和切换被动模式都如出一辙,只需要改变发送到服务器端的命令,并通过数据连接发送文件内容。
当客户端发送命令上传文件,服务器会从数据连接接收文件。
图 6. 客户端连接到 FTP 服务器的数据端口并上传文件

到目前为止,本文介绍的都是客户端用被动模式进行文件的上传和下载。下面将介绍客户端用主动模式下载文件。
图 7. 用主动模式从 FTP 服务器下载文件

清单 7. 用主动模式从 FTP 服务器下载文件的示例 C 程序
//... ...
SOCKET data_sock;
data_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in name;
name.sin_family = AF_INET;
name.sin_addr.s_addr = htons(INADDR_ANY);
server_port = p1*256+p2;
length = sizeof(name);
name.sin_port = htons(server_port);
bind(server_sock, (struct sockaddr *)&name, length);
struct sockaddr_in client_name;
length = sizeof(client_name);
/* 客户端开始监听端口p1*256+p2 */
listen(server_sock, 64);
/* 命令 ”PORT
” */
sprintf(send_buf,"PORT 1287,0,0,1,%d,%d
", p1, p2);
write(control_sock, send_buf,strlen(send_buf));
/* 客户端接收服务器的响应码和信息,正常为 ”200 Port command successful” */
read(control_sock, read_buf, read_len);
sprintf(send_buf,"RETR filename.txt
");
write(control_sock, send_buf, strlen(send_buf));
/* 客户端接收服务器的响应码和信息,正常为 ”150 Opening data channel for file transfer.” */
read(control_sock, read_buf, read_len);
/* ftp客户端接受服务器端的连接请求 */
data_sock = accept(server_sock,(struct sockaddr *)&client_name, &length);
//... ...
file_handle = open(disk_name, ROFLAGS, RWXALL);
for( ; ; ) {
//... ...
read(data_sock, read_buf, read_len);
write(file_handle, read_buf, read_len);
//... ...
}
close(file_handle);