【发布时间】:2017-10-17 04:30:23
【问题描述】:
我正在重新编码一个简单的 ftp 服务器,但我无法实现 PASV 命令。
实际上,当客户端发送 PASV 命令时,我必须创建一个新的服务器套接字并将信息(地址和端口)发送回客户端,以便他可以连接到它以创建数据连接。
我一步一步做的是:
- 使用 INADDR_ANY 和随机端口(端口 0)创建服务器套接字
- 用这个套接字监听()
- getsockname() 这个套接字来获取它的信息
- 通过命令连接将信息发送回客户端
- accept() 稍后完成,当用户需要使用数据 con 时
(这是正确的做法吗?)
问题是,我在服务器端创建的服务器套接字与 INADDR_ANY 绑定,因此其上的 getsockname() 始终返回 0.0.0.0(因为它几乎绑定到系统外的所有 ips)。
这样的话,我应该发回什么地址给客户,如何找到?
真正的 ftp 服务器如何处理这个问题?
谢谢:)
【问题讨论】:
-
您知道当前 FTP 连接使用的是哪个本地接口。绑定到 那个 接口(使用随机端口)。
-
现在绑定到
INADDR_ANY应该可以了。但是,只绑定到客户端正在使用的地址会更简洁。我认为您可以通过在 connected 套接字(用于命令连接)而不是侦听套接字上使用getsockname()来获得它。 -
@Someprogrammerdude 我如何知道我当前的 FTP 连接使用的是哪个接口?
-
@JohnBollinger 所以我在这里只是获取命令连接套接字的名称并保存地址并使用我的数据连接套接字绑定到它?那些地址总是一样的?
-
@JohnBollinger:“当客户端尝试建立数据连接时,它将尝试连接到已经建立命令连接的同一台机器” - per根据 FTP 规范,客户端应该连接到服务器所说的任何 IP,该 IP 可以是服务器想要的任何 IP,如果它愿意的话,甚至可以连接到另一台机器。实际上,FTP 客户端通常可以选择忽略服务器声明的 IP,而只使用已经连接的 IP,通常没问题。