【问题标题】:FTP implementation: close data socket every timeFTP实现:每次关闭数据套接字
【发布时间】:2015-02-11 11:51:00
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: c sockets ftp


    【解决方案1】:

    当一个套接字关闭时,它进入TIME WAIT 状态(see here for the possible TCP states)并且在套接字离开TIME WAIT 并处于CLOSED 状态之前,不能将其他套接字绑定到相同的地址/端口对.

    可以通过设置SO_REUSEADDR 套接字选项来解决此问题,如果其中一个套接字处于TIME WAIT 状态,这将允许两个套接字绑定到相同的地址。

    【讨论】:

    • ftp是这样用的吗?
    • @FedericoPonzi 我实际上不知道,但这似乎是合乎逻辑的。它通常用于所有被动(侦听)套接字。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 2015-09-06
        • 2013-11-08
        • 1970-01-01
        相关资源
        最近更新 更多