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);