2015-02-11 60 views
0

我正在实现一种FTP协议。FTP实现:每次关闭数据套接字

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

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

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

由于

回答

1

当套接字被关闭时,它进入TIME WAIT状态(see here for the possible TCP states)和直到插座离开TIME WAIT并且处于CLOSED状态没有其他插座可以被绑定到相同的地址/端口对。

可以去解决这个通过设置SO_REUSEADDR套接字选项,这将允许两个插座绑定到同一个地址,如果插座中的一个是在TIME WAIT状态。

+0

这是ftp使用的方式吗? – 2015-02-11 12:48:05

+0

@FedericoPonzi我其实不知道,但这似乎合乎逻辑。它通常用于所有被动(监听)插座。 – 2015-02-11 12:52:00

-1

在我的项目,我使用Apache-commons-净, 只是保持命令连接与心跳命令, 和enter local passive mode每次做文件传输活着。 原理与您的情况相同,建议在获取file.txt之前发送 EPSV 命令。

指的是:https://commons.apache.org/proper/commons-net/