【问题标题】:getaddrinfo - results differ for numeric vs. named servicegetaddrinfo - 数字服务与命名服务的结果不同
【发布时间】:2016-11-02 21:59:57
【问题描述】:

我对 getaddrinfo() 的行为有疑问,这似乎取决于如何指定服务参数。将服务指定为名称会导致 getaddrinfo() 使用 getservbyname() 来查询 /etc/services 数据库,但以数字方式指定服务显然不会导致此类查询,这可能会导致结果不同。

例如,指定 service = "5672"(amqp 的端口),返回协议 IPPROTO_TCP、IPPROTO_UDP 和 IPPROTO_IP 的 addrinfo 结构列表,而指定 service = "amqp",返回协议的 addrinfo 结构列表协议 IPPROTO_TCP、IPPROTO_UDP 和 IPPROTO_SCTP。

为什么 getaddrinfo() 不查询 /etc/services 数据库,服务是数字指定的?感谢您的帮助。

更新:
事实证明,这只是 getaddrinfo() 设计用于处理服务参数的方式。如果您知道端口号,那就太好了。如果您只知道服务名称,getaddrinfo() 会为您查找端口号。

那么对我来说真正的问题是,即使在我的系统(Ubuntu 16.04)上安装了 SCTP,getaddrinfo() 也不会返回带有 IPPROTO_SCTP 的 addrinfo 结构。查看 getaddrinfo() 的源代码,它似乎返回了它所知道的所有协议的 addrinfo 结构在它被构建时,而不是在被调用时。

我想我可能需要重建 glibc 以获得支持 SCTP 的 getaddrinfo() 版本。谁能确认或更正我的理解?

【问题讨论】:

    标签: c unix getaddrinfo


    【解决方案1】:

    显然有很多代码假定协议 = 0 和类型 = SOCK_STREAM 意味着 TCP。如果 getaddrinfo() 返回带有 IPPROTO_SCTP 的 addrinfo 结构,则此代码会中断。折衷的解决方案(至少对于 FreeBSD 和 linux 而言)是继续让 getaddrinfo() 仅返回协议 = 0 和类型 = SOCK_STREAM 的 IPPROTO_TCP addrinfo 结构。任何想要 getaddrinfo() 返回带有 IPPROTO_SCTP 的 addrinfo 结构的人都应该在提示中指定 ai_protocol = IPPROTO_SCTP。这仅适用于将服务 arg 指定为数字的情况;指定为名称的服务将导致 getaddrinfo() 查询 /etc/services 数据库,结果中指定的协议将基于在那里找到的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2010-11-15
      • 2016-09-21
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      相关资源
      最近更新 更多