【发布时间】: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