【问题标题】:When inet_pton fails but getaddrinfo succeeds?当 inet_pton 失败但 getaddrinfo 成功时?
【发布时间】:2021-02-20 21:53:09
【问题描述】:

在旧代码库中,我看到了以下工作流程。

给定一个host(即const char*),第一步是使用inet_ptonhost转换为ip(即uint32_t)。在失败的情况下,它会处理第二步,即使用getaddrinfo 检索ip(即 sockaddr_in::sin_addr::s_addr)。

问题> 谁能给我举一个 inet_pton 失败(即 return != 1)而 getaddrinfo 成功的例子?

【问题讨论】:

  • inet_pton 适用于“172.217.12.196”,但适用于“www.google.com”。 inet_pton(),将数字和点表示法的 IP 地址转换为结构 in_addr

标签: c linux network-programming


【解决方案1】:

谁能给我一个例子,其中 inet_pton 失败(即返回!= 1)而 getaddrinfo 成功?

inet_pton()将以字符串形式表示的IP地址转换为地址结构。

getaddrinfo() 可以做同样的事情(gethostbyname() 也可以做),但它也可以查找主机 name 以获取地址,并用结果填充地址信息结构. getaddrinfo() 也做了一些其他的工作。

因此,如果你给inet_pton() 提供一个表示主机名的字符串,比如"stackoverflow.com"inet_pton() 将失败,但gethostbyname() 对于这样的输入很可能会成功。

给定host(即const char*),第一步是使用inet_pton进行转换 host 到 ip(即uint32_t)。在失败的情况下,它处理步骤 二是使用getaddrinfo检索ip

这听起来像是允许通过 IP 地址或名称指定机器,由不理解 getaddrinfo() 可以同时处理两者的人指定。在软件的某些早期版本中,对getaddrinfo() 的调用可能是对gethostbyname() 的调用,这可以更好地解释这种混淆。

或者这个想法可能是优化通过 IP 号识别机器的路径,假设 inet_pton()getaddrinfo() 便宜很多。

无论哪种方式,我都倾向于直接转到getaddrinfo(),而不尝试inet_pton()

【讨论】:

    【解决方案2】:

    来自inet_pton

    返回值

    inet_pton() 成功时返回 1(网络地址已成功转换)。如果 src 不包含表示指定地址族中有效网络地址的字符串,则返回 0。如果 af 不包含有效的地址族,则返回 -1 并将 errno 设置为 EAFNOSUPPORT。

    很容易看出inet_pton 何时可能失败,而getaddrinfo 有更多的“细粒度”(负)返回值(参见 man getaddrinfo)。

    getaddrinfo 只是一种更方便的获取套接字地址的方法。

    来自getaddrinfo的手册页:

    描述

    ...
    getaddrinfo() 函数将 gethostbyname(3) 和 getservbyname(3) 函数提供的功能组合到一个接口中,但与后面的函数不同,getaddrinfo() 是可重入的,并且允许程序消除 IPv4 与 IPv6 的依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2011-10-16
      相关资源
      最近更新 更多