2011-03-16 121 views
3

我試圖使用libresolv框架中使用,以獲得我的DNS服務器IP,但我得到的是「0.0.0.0」獲取DNS服務器IP上IPhone

-(void) getDns 
{ 
    res_init(); 

    for (int i=0;i<MAXNS;i++) 
    {  
     printf("%s",inet_ntoa(_res.nsaddr_list[i].sin_addr)); 

    } 
} 

任何問題在這裏我的代碼?

感謝

編輯

試過使用SO的其他問題的代碼,但是這是我所得到的主機時, 「apple.com」

2011-03-16 15:07:21.689 MobileMax[5876:207] RESOLVED 0:<17.149.160.49> 
2011-03-16 15:07:21.691 MobileMax[5876:207] RESOLVED 1:<17.251.200.70> 
2011-03-16 15:07:21.691 MobileMax[5876:207] RESOLVED 2:<17.112.152.57> 

而當運行命令:cat /etc/resolv.conf 我得到nameserver 10.0.0.138這就是我想要的。

任何想法如何得到?

EDIT2

我想這是很好,但仍然得到 「0.0.0.0」 的迴應。

u_char buf[NS_PACKETSZ]; 
int responseLen;    

    res_query("www.google.com",ns_c_in,ns_t_ns,buf,sizeof(buf)); 
+0

哦,現在我得到你想要的...只有這樣我可以看到現在的問題是實際上解析'的/ etc/resolv.conf'。我很好奇,爲什麼你需要DNS服務器的IP? – DarkDust 2011-03-16 14:04:42

+2

請參閱http://stackoverflow.com/questions/10999612/iphone-get-3g-dns-host-name-and-ip-address – AriX 2012-07-20 23:02:18

+0

運行模擬器時,我也會得到0.0.0.0的信息。但是當我在真實設備上嘗試代碼時,它實際上會返回正確的dns ip地址。所以你的代碼沒有問題。 – user2061448 2013-02-11 13:32:27

回答

0

你沒有解決任何問題,你只是打印存儲在某個變量中的地址。您實際上需要致電 res_queryres_search。但在iOS上,最好使用CFHost *方法,如 this question。還有 sample code from Apple(搜索 MyResolveNameToAddress函數)。

理解問題後更新:根據this question,您無法訪問/etc/resolv.conf文件(權限)。但根據this question可能通過使用SystemConfigFramework成功,但我不知道它是否適用於iOS(框架存在,但信息是否暴露我不知道)。

+0

嗯,我想有一些辦法,希望有人會回答我有一天:) – Idan 2011-03-18 08:32:54

0

請嘗試以下代碼以獲取DNS服務器地址。不要忘了鏈接libresolv.lib

#include <arpa/inet.h> 
    #include <ifaddrs.h> 
    #include <resolv.h> 
    #include <dns.h> 

    - (NSString *) getDNSServers 
    { 
    // dont forget to link libresolv.lib 
    NSMutableString *addresses = [[NSMutableString alloc]initWithString:@"DNS Addresses \n"]; 

    res_state res = malloc(sizeof(struct __res_state)); 

    int result = res_ninit(res); 

    if (result == 0) 
    { 
     for (int i = 0; i < res->nscount; i++) 
     { 
      NSString *s = [NSString stringWithUTF8String : inet_ntoa(res->nsaddr_list[i].sin_addr)]; 
      [addresses appendFormat:@"%@\n",s]; 
      NSLog(@"%@",s); 
     } 
    } 
    else 
     [addresses appendString:@" res_init result != 0"]; 

    return addresses; 
} 
+0

這將無法檢測IPv6 DNS服務器(如果你有一些將會實際上破壞)。我有一些Swift 3代碼在我的答案中的另一個問題http://stackoverflow.com/a/41303040/6782 – Alnitak 2017-01-03 13:59:43

+0

@Alnitak這是一箇舊的答案,我會盡快更新 – 2017-01-03 15:04:18

+0

任何方式,你不應該偷看到'res-> nsaddr_list'的內部 - 'res_getservers()'函數返回列表 – Alnitak 2017-01-03 16:08:23