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

时间:2015-02-11 11:51:01

标签: c sockets ftp

我正在实现一种FTP协议。

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

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

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

由于

3 个答案:

答案 0 :(得分:2)

当套接字关闭时,它进入TIME WAIT状态(see here for the possible TCP states),并且在套接字离开TIME WAIT之前,没有其他套接字可以绑定到同一个地址/端口对,并且在CLOSED州。

可以通过设置SO_REUSEADDR套接字选项来解决这个问题,如果其中一个套接字在{{1}中,则允许两个套接字绑定到同一个地址国家。

答案 1 :(得分:1)

每次都需要打开套接字进行传输,因为服务器会在传输结束时将其关闭。 通过从FTP服务器读取状态代码(226或250)的响应,您将知道该文件已下载/上传 - 检查FTP服务器返回代码列表: https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes

答案 2 :(得分:-1)

在我的项目中,我使用apache-commons-net, 只需使用heartbeat命令保持命令连接处于活动状态, 和enter local passive mode每次都要进行文件传输。 对你的情况原则是一样的,我建议发送 EPSV 在获取file.txt之前执行命令。

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