带有AI_NUMERICHOST的getaddrinfo

时间:2019-03-21 00:45:26

标签: c linux dns posix

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

其中可能的标志值为ai_flags。根据{{​​3}},这通知AI_NUMERICHOST主机名字符串是IP地址。由于主机名已经是IP地址(而不是主机名),因此不需要DNS解析。

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

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

如果没有,getservbyname()的目的是什么?

1 个答案:

答案 0 :(得分:2)

getaddrinfoAI_NUMERICHOST的主要用途是与inet_atoninet_pton无关的IPv4 / IPv6替代。也就是说,它接收文本IPv4 IPv6地址并将其转换为sockaddr对象;调用代码不必知道哪个是哪个。

确实可以将其用作线程安全的getservbyname,但我不记得上次看到没有的代码使用{{1} },所以我认为这不是重要的属性。