我正在尝试使用CFHostGetAddressing进行简单的DNS查找。但是,我注意到它返回一个sockaddr结构数组,我猜这意味着它只能执行IPV4。
有没有办法在iOS中支持带IPV6地址的DNS条目?也许类似的API返回一个sockaddr_storage结构数组?
答案 0 :(得分:3)
CFHostGetAddressing()
文档可能会产生误导,因为struct sockaddr
是一种覆盖各种套接字地址(IPv4,IPv6,...)的所有常见元素的结构。它通常仅用于将通用指针传递给套接字函数。
实际上CFHostGetAddressing()
适用于IPv6。它返回一个CFData
元素数组,其中每个元素都包含struct sockaddr_in
或struct 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()
}