CFHostGetAddressing()是否支持ipv6 DNS条目?

时间:2014-07-17 06:16:58

标签: ios objective-c swift core-foundation

我正在尝试使用CFHostGetAddressing进行简单的DNS查找。但是,我注意到它返回一个sockaddr结构数组,我猜这意味着它只能执行IPV4。

有没有办法在iOS中支持带IPV6地址的DNS条目?也许类似的API返回一个sockaddr_storage结构数组?

1 个答案:

答案 0 :(得分:3)

CFHostGetAddressing()文档可能会产生误导,因为struct sockaddr 是一种覆盖各种套接字地址(IPv4,IPv6,...)的所有常见元素的结构。它通常仅用于将通用指针传递给套接字函数。

实际上CFHostGetAddressing()适用于IPv6。它返回一个CFData元素数组,其中每个元素都包含struct sockaddr_instruct sockaddr_in6

使用上一个问题的代码作为起点,以下内容应该有效:

let hostRef = CFHostCreateWithName(kCFAllocatorDefault, "localhost").takeRetainedValue()
var resolved = CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil)
let addresses = CFHostGetAddressing(hostRef, &resolved).takeRetainedValue() as NSArray

for addr in addresses as [NSData] {
    var sockaddr = UnsafePointer<sockaddr_storage>.alloc(1)
    addr.getBytes(sockaddr, length: sizeof(sockaddr_storage))
    // ...
    sockaddr.destroy()
}