POSIX getaddrinfo()
函数用于执行DNS解析以及服务名称解析。传递给hints
的{{1}}参数具有一个标志字段getaddrinfo()
。
其中可能的标志值为ai_flags
。根据{{3}},这通知AI_NUMERICHOST
主机名字符串是IP地址。由于主机名已经是IP地址(而不是主机名),因此不需要DNS解析。
我在理解此标志的目的或用例时遇到麻烦。如果您已经拥有IP地址,为什么还要呼叫getaddrinfo()
?我可能看到的唯一可能的目的是,您已经拥有IP地址,但只想获取服务名称。但是在那种情况下,您可以直接调用getaddrinfo()
,这会简单得多。
我唯一想到的是getservbyname()
是可重入的,而显然getaddrinfo()
不是可重入的。那么,getservbyname()
标志的全部目的是否只是为了提供一种实现线程安全的AI_NUMERICHOST
的绕行方式?
如果没有,getservbyname()
的目的是什么?
答案 0 :(得分:2)
getaddrinfo
与AI_NUMERICHOST
的主要用途是与inet_aton
和inet_pton
无关的IPv4 / IPv6替代。也就是说,它接收文本IPv4 和 IPv6地址并将其转换为sockaddr
对象;调用代码不必知道哪个是哪个。
确实可以将其用作线程安全的getservbyname
,但我不记得上次看到没有的代码使用{{1} },所以我认为这不是重要的属性。