【问题标题】:Getting DNS server IP on IPhone在 iPhone 上获取 DNS 服务器 IP
【发布时间】:2011-03-16 12:41:31
【问题描述】:

我正在尝试使用 libresolv 框架获取我的 dns 服务器 IP,但我得到的只是“0.0.0.0”

-(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,这就是我想要的。

知道如何获得吗?

编辑2

我也试过了,但仍然得到“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));

【问题讨论】:

  • 哦,现在我得到了你想要的......我现在能看到的唯一方法是实际解析 /etc/resolv.conf。我很好奇,你为什么需要你的 DNS 服务器的 IP?
  • 我在运行模拟器时也得到了0.0.0.0的信息。但是当我在真实设备上尝试代码时,它实际上返回了正确的 dns ip-address。所以你的代码没有问题。

标签: iphone objective-c cocoa-touch


【解决方案1】:

你没有解决任何问题,你只是打印存储在某个变量中的地址。您实际上需要致电res_queryres_search。但在 iOS 上,最好使用 CFHost* 方法,例如 this question。还有sample code from Apple(搜索MyResolveNameToAddress函数)。

了解问题后更新:根据this question,您无法访问/etc/resolv.conf 文件(权限)。但根据this question,您可能通过使用 SystemConfigFramework 成功,但我不知道它是否适用于 iOS(该框架存在,但我不知道该信息是否暴露)。

【讨论】:

  • 嗯,我想有办法,希望有一天有人会回答我:)
【解决方案2】:

尝试下面的代码来获取 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;
}

【讨论】:

  • 这将无法检测到 IPv6 DNS 服务器(如果有的话实际上会中断)。我在回答stackoverflow.com/a/41303040/6782 的另一个问题时有一些 Swift 3 代码
  • 不管怎样,你不应该窥视res-&gt;nsaddr_list的内部——res_getservers()函数返回列表
  • Objective-C 方法:stackoverflow.com/questions/31256024/…inet_ntoa 不是最佳方法,因为它仅支持 IPv4
猜你喜欢
  • 2015-09-24
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多