2014-07-17 119 views
2

我想使用CFHostGetAddressing做一個簡單的DNS查找。但是,我注意到它返回了一個sockaddr結構體的數組,我猜這意味着它只能執行IPV4。CFHostGetAddressing()是否支持ipv6 DNS條目?

有沒有辦法在iOS中支持IPV6地址的DNS條目?也許一個類似的API返回一個sockaddr_storage結構數組?

回答

2

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() 
}