2014-09-17 8 views
8

Ich möchte die IP-Kleid (wie 192.168.0.1 oder 87.12.56.50) von DNS-Abfrage in . Ich habe versucht, 100-mal mit 100 diffrent Methoden ... Nichts half mir, so dass ich um Hilfe zu bitten (ich hoffe, es gibt alots des Volkes hier;)) Das ist mein Code so weit:Wie kann ich eine echte IP-Adresse von DNS-Abfrage in Swift bekommen?

let host = CFHostCreateWithName(nil,"subdomain.of.stackoverflow.com").takeUnretainedValue(); 
CFHostStartInfoResolution(host, .Addresses, nil); 
var success: Boolean = 0; 
let addresses = CFHostGetAddressing(host, &success).takeUnretainedValue() as NSArray; 
if(addresses.count > 0){ 
    let theAddress = addresses[0] as NSData; 
    println(theAddress); 
} 

OK ... Dies sind die Links für den Code, den ich ohne Erfolg umzusetzen versucht: https://gist.github.com/mikeash/bca3a341db74221625f5
How to perform DNS query on iOS
Create an Array in Swift from an NSData Object
Does CFHostGetAddressing() support ipv6 DNS entries?
Do a simple DNS lookup in Swift
wenn wir also mit unsinnigen negat fertig sind Wir können versuchen, eine Lösung zu finden und anderen Menschen (wie mir) zu helfen.

Antwort

23

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) 
     } 
    } 
} 
+0

OMG! Es funktioniert ... :) –

+0

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! –

+0

@ ХристоАтанасов: Also sollten Sie jetzt die Dokumentation auf getnameinfo() und all das Zeug lesen, bis Sie es verstehen :) –

Verwandte Themen