2015-01-18 09:59:35|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
当客户端下载完毕后,发送命令退出服务器,并关闭连接。服务器会返回响应码 200。
图 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 表明完成。