【问题标题】:Socket, how to find local address when binded with INADDR_ANY套接字,与 INADDR_ANY 绑定时如何查找本地地址
【发布时间】:2017-10-17 04:30:23
【问题描述】:

我正在重新编码一个简单的 ftp 服务器,但我无法实现 PASV 命令。

实际上,当客户端发送 PASV 命令时,我必须创建一个新的服务器套接字并将信息(地址和端口)发送回客户端,以便他可以连接到它以创建数据连接。

我一步一步做的是:

  1. 使用 INADDR_ANY 和随机端口(端口 0)创建服务器套接字
  2. 用这个套接字监听()
  3. getsockname() 这个套接字来获取它的信息
  4. 通过命令连接将信息发送回客户端
  5. 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,通常没问题。

标签: c sockets server ftp


【解决方案1】:

我一步一步做的是:

  1. 使用 INADDR_ANY 和随机端口(端口 0)创建服务器套接字
  2. 用这个套接字监听()
  3. getsockname() 这个套接字来获取它的信息
  4. 通过命令连接将信息发送回客户端
  5. accept() 稍后完成,当用户需要使用数据 con 时

(这是正确的做法吗?)

一般来说,是的,但是第 1 步和第 3 步往往比这更复杂。

一方面,在套接字实际连接到某人之前,getsockname() 无法获得真正的 IP(在这种情况下,这意味着您必须在 accept() 返回的套接字上调用 getsockname(),而不是在您调用accept() 的套接字)。因此,当绑定到INADDR_ANY 时,您应该只报告命令套接字连接到的接口的 IP。在这种情况下,最好只将监听套接字直接绑定到该接口,而不是绑定到INAADDR_ANY

另一方面,即使服务器机器只安装了一个接口,如果服务器在 NAT 路由器后面,而客户端在 NAT 之外,那么您将不得不报告路由器的公共 IP 而不是服务器的监听知识产权。您必须提前知道路由器的公共 IP,方法是将其存储在应用程序的配置中,或者通过 uPNP 动态查询路由器本身,或者通过查询外部服务(如 http://iplookup.flashfxp.com/)。除非路由器支持 FTP(有些支持)并且足够智能,可以在通过路由器时为您替换报告的 IP,在这种情况下,您必须报告您的侦听 IP。

【讨论】:

    【解决方案2】:

    您应该在命令套接字上调用getsockname()。这为您提供了客户端用于连接到您的 IP 地址。对于多宿主主机上的每个客户端,它可能不同。如果您在 NAT 设备后面,则应使用其公共 IP 地址,您必须通过配置获取该地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2020-02-20
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多