c - 使用 AI_NUMERICHOST 获取地址信息

标签 c linux dns posix

POSIX getaddrinfo() 函数用于执行 DNS 解析,以及服务名称解析。传递给 getaddrinfo()hints 参数有一个标志字段,ai_flags

AI_NUMERICHOST 是可能的标志值。根据the documentation , 这会通知 getaddrinfo() 主机名字符串是一个 IP 地址。由于主机名已经是 IP 地址(而不是主机名),因此不需要 DNS 解析。

我无法理解此标志的用途或用例。如果您已经有了 IP 地址,为什么还需要调用 getaddrinfo()?我能看到的唯一可能的目的是您已经拥有 IP 地址,但只想获取服务名称。但在那种情况下,您可以直接调用 getservbyname(),这样会简单得多。

我唯一能想到的是 getaddrinfo() 是可重入的,而 getservbyname() 显然不是可重入的。那么 AI_NUMERICHOST 标志的全部目的是否只是提供一种执行线程安全 getservbyname() 的迂回方式?

如果不是,AI_NUMERICHOST 的目的是什么?

最佳答案

getaddrinfo的主要用途与 AI_NUMERICHOST将成为 inet_aton 的 IPv4/IPv6 不可知替代品和 inet_pton .也就是说,它采用文本 IPv4 IPv6 地址并将它们转换为 sockaddr对象;调用代码不必知道哪个是哪个。

您也可以将其用作线程安全的 getservbyname ,但我不记得上次看到没有使用 AI_NUMERICSERV 的代码是什么时候了。 ,所以我认为这不是重要的属性。

关于c - 使用 AI_NUMERICHOST 获取地址信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272192/

相关文章:

linux - Ubuntu 18.04 Oracle Virtualbox显示异常

nginx - 将虚拟主机分配给 Docker 端口

nginx - 使用Skydns的Kubernetes的Nginx解析器

我可以用 C 编写一个终端程序来在 GIMP [macOS] 中编辑照片吗?

c# - 如何从Windows系统中彻底删除文件

c - 模块函数不返回答案

linux - 如何读取 AWS ElasticBeanstalk 中设置的环境属性

c - 在c中哪里以及如何使用fwrite函数

c - 错误 : expected declaration specifiers or '...' before XXX (all kinds of parameters)

amazon-web-services - 我需要route53将域绑定(bind)到ec2吗?