Ihr Code ruft die Adresse als "Socket-Adresse" Struktur ab. getnameinfo()
kann verwendet werden, um die Adresse in einen numerischen IP-String zu konvertieren (Code aus https://stackoverflow.com/a/25627545/1187415 recycelt, jetzt Swift 2 aktualisiert):
let host = CFHostCreateWithName(nil,"www.google.com").takeRetainedValue()
CFHostStartInfoResolution(host, .Addresses, nil)
var success: DarwinBoolean = false
if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?,
let theAddress = addresses.firstObject as? NSData {
var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)
if getnameinfo(UnsafePointer(theAddress.bytes), socklen_t(theAddress.length),
&hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 {
if let numAddress = String.fromCString(hostname) {
print(numAddress)
}
}
}
Ausgabe (Beispiel): auch 173.194.112.147
Hinweis die Verwendung von takeRetainedValue()
in der ersten Zeile, weil CFHostCreateWithName()
hat "Create" in seinem Namen der daher ein (+1) beibehalten Objekt zurückgibt.
Update für Swift 3/Xcode 8:
let host = CFHostCreateWithName(nil,"www.google.com" as CFString).takeRetainedValue()
CFHostStartInfoResolution(host, .addresses, nil)
var success: DarwinBoolean = false
if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?,
let theAddress = addresses.firstObject as? NSData {
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length),
&hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 {
let numAddress = String(cString: hostname)
print(numAddress)
}
}
Oder alle IP-Adressen für den Host zu bekommen:
let host = CFHostCreateWithName(nil,"www.google.com" as CFString).takeRetainedValue()
CFHostStartInfoResolution(host, .addresses, nil)
var success: DarwinBoolean = false
if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray? {
for case let theAddress as NSData in addresses {
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length),
&hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 {
let numAddress = String(cString: hostname)
print(numAddress)
}
}
}
OMG! Es funktioniert ... :) –
Du bist der Mann! Ich bin Swift sehr neu und glaube mir ... du hast meinem Code nur 5 Zeilen hinzugefügt, aber ich verstehe kein Wort davon. Du hast mir also Zeit gespart. Ich würde das nicht alleine machen! Danke! –
@ ХристоАтанасов: Also sollten Sie jetzt die Dokumentation auf getnameinfo() und all das Zeug lesen, bis Sie es verstehen :) –