2014-09-17 17 views
8

IP elbise (192.168.0.1 veya 87.12.56.50 gibi), Swift numaralı DNS sorgusundan almak istiyorum.Swift'de DNS sorgusundan nasıl gerçek bir IP adresi alabilirim?

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); 
} 
:; ı Hiçbir şey bana yardımcı ... 100 diffrent yöntemlerle 100 kez denedik, bu yüzden (ben orada umut Burada halk alots olan) yardım istemek gerekecek) Bu benim defa kodudur biz anlamsız negat ile bitirdiniz Yani 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
:

... Tamam Bunlar başarılı olamadı uygulamaya çalışmıştır kodu için bağlantılar Bu soruna oy vermek için bir çözüm bulmaya ve diğer insanlara yardım etmeyi deneyebiliriz (benim gibi)

cevap

23

Kodunuz adresinizi bir "soket adresi" yapısı olarak alır. getnameinfo() bir sayısal IP dizesine adresini dönüştürmek için kullanılabilir (kod https://stackoverflow.com/a/25627545/1187415 geri dönüştürülmüş, hemen Swift 2 güncellendi):

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

Çıkış (örnek) de: 173.194.112.147

Not İlk satırda takeRetainedValue() kullanımı, çünkü CFHostCreateWithName()10 kendi adına "Oluştur" a sahiptir, bu nedenle (+1) tutulan bir nesnesini döndürür. Swift 3/Xcode 8 için


Güncelleme:

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

Veya, konak için tüm IP adreslerini almak için:

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! Bu çalışıyor ... :) –

+0

Sen adamsın! Swift’e çok yeniyim ve inan bana ... koduma sadece 5 satır ekledin, ama bunun bir kelimesini anlamıyorum. Yani bana zaman kazandırdın. Bunu kendi başıma yapmayacağım! Thanx! –

+0

@ ХристоАтанасов: Yani şimdi anlayabilmeniz için getnameinfo() ve tüm bu şeylerin belgelerini okumanız gerekiyor :) –