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

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

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

客户端退出服务器

当客户端下载完毕后,发送命令退出服务器,并关闭连接。服务器会返回响应码 200。

5. 客户端从 FTP 服务器退出

图 5. 客户端从 FTP 服务器退出

清单 5. 客户端关闭数据连接,退出 FTP 服务器并关闭控制连接

/* 客户端关闭数据连接 */

close(data_sock);

/* 客户端接收服务器的响应码和信息,正常为 ”226 Transfer complete.” */

read(control_sock, read_buf, read_len);

/* 命令 ”QUIT
” */
sprintf(send_buf,"QUIT
");

/* 客户端将断开与服务器端的连接 */

write(control_sock, send_buf, strlen(send_buf));
/* 客户端接收服务器的响应码,正常为 ”200 Closes connection.” */

read(control_sock, read_buf, read_len);
/* 客户端关闭控制连接 */
close(control_sock);

至此,下载文件已经完成。需要注意的是发送 FTP 命令的时候,在命令后要紧跟 “ ”,否则服务器不会返回信息。回车换行符号 “ ” 是 FTP 命令的结尾符号,当服务器接收到这个符号时,认为客户端发送的命令已经结束,开始处理。否则会继续等待。

让我们来看一下 FTP 服务器这一端的响应情况:

清单 6. 客户端下载文件时,FTP 服务器的响应输出

(not logged in) (127.0.0.1)> Connected, sending welcome message...

(not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.36 beta

(not logged in) (127.0.0.1)> 220 hello gaoleyi

(not logged in) (127.0.0.1)> USER gaoleyi

(not logged in) (127.0.0.1)> 331 Password required for gaoleyi

(not logged in) (127.0.0.1)> PASS *********

gaoleyi (127.0.0.1)> 230 Logged on

gaoleyi (127.0.0.1)> PWD

gaoleyi (127.0.0.1)> 257 "/" is current directory.

gaoleyi (127.0.0.1)> SIZE file.txt

gaoleyi (127.0.0.1)> 213 4096

gaoleyi (127.0.0.1)> PASV

gaoleyi (127.0.0.1)> 227 Entering Passive Mode (127,0,0,1,13,67)

gaoleyi (127.0.0.1)> RETR file.txt

gaoleyi (127.0.0.1)> 150 Connection accepted

gaoleyi (127.0.0.1)> 226 Transfer OK

gaoleyi (127.0.0.1)> QUIT

gaoleyi (127.0.0.1)> 221 Goodbye

首先,服务器准备就绪后返回 220。客户端接收到服务器端返回的响应码后,相继发送“USER username” 和 “PASS password” 命令登录。随后,服务器返回的响应码为 230 开头,说明客户端已经登入了。这时,客户端发送 PASV 命令让服务器进入被动模式。服务器返回如 “227 Entering Passive Mode (127,0,0,1,13,67)”,客户端从中得到端口号,然后连接到服务器的数据端口。接下来,客户端发送下载命令,服务器会返回响应码 150,并从数据端口发送数据。最后,服务器返回 “226 transfer complete”,表明数据传输完成。

需要注意的是,客户端不要一次发送多条命令,例如我们要打开一个目录并且显示这个目录,我们得发送 CWD dirname,PASV,LIST。在发送完 CWD dirname 之后等待响应代码,然后再发送后面一条。当 PASV 返回之后,我们打开另一个 Socket 连接到相关端口上。然后发送 LIST,返回 125 之后在开始接收数据,最后返回 226 表明完成。

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