FTP 实现:每次关闭数据套接字

FTP implementation: close data socket every time

我正在用 c 实现一种 FTP 协议。

我有一个服务器 运行。 我启动客户端,连接到服务器,然后发送一个 GET file.txt 请求。 客户端解析命令,看到它是 GET 命令并启动服务器套接字。 服务端收到命令,开始与客户端的数据连接,并开始在这个连接上发送file.txt。

当服务器发送文件时,它关闭客户端套接字(数据)。

当我想获取另一个文件时,该端口已被使用。我怎样才能防止这种情况?我应该为所有命令连接会话保持数据连接打开吗?在这种情况下,我的客户如何知道文件何时结束?

谢谢

当一个套接字关闭时,它进入TIME WAIT状态(see here for the possible TCP states)并且在套接字离开[=10之前,没有其他套接字可以绑定到相同的address/port对=] 并且处于 CLOSED 状态。

可以 通过设置 SO_REUSEADDR 套接字选项来解决这个问题,如果其中一个套接字在TIME WAIT 状态。

每次传输都需要打开套接字,因为传输完成后服务器会关闭套接字。 通过读取来自 FTP 服务器的状态代码(226 或 250)的响应,您将知道该文件是 downloaded/uploaded - 检查 FTP 服务器 return 代码的列表: https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes

在我的项目中,我使用apache-commons-net, 只需使用心跳命令使命令连接保持活动状态, 和 enter local passive mode 每次做文件传输。 原理和你的情况一样,建议发 EPSV 获取 file.txt.

之前的命令

参考:https://commons.apache.org/proper/commons-net/