5

エンド ツー エンドの SMTP を実行するために使用するクロス プラットフォームの DNS クライアント コードがいくつかあります。Windows では、レジストリを調べることで現在の DNS サーバーの IP アドレスを見つけることができます。Mac では、最初の回答で述べたようにおそらく SystemConfiguration フレームワークを使用できますが、その正確な方法はすぐにはわかりません。

たとえば、SCDynamicStoreCopyDHCPInfo は動的 DHCP 関連データの一部を返しますが、DNS サーバー アドレスは返しません。

4

5 に答える 5

6

この質問に答えるのが非常に遅いことはわかっていますが、他の人にとっては役立つかもしれません。

このコードは、このタスクに役立ちます..

SCPreferencesRef prefsDNS = SCPreferencesCreate(NULL, CFSTR("DNSSETTING"), NULL);
CFArrayRef services = SCNetworkServiceCopyAll(prefsDNS);
long servicesCount = CFArrayGetCount(services);
for (long i = 0; i < servicesCount; i++) {
    const SCNetworkServiceRef service = (const SCNetworkServiceRef)CFArrayGetValueAtIndex(services, i);
    CFStringRef interfaceServiceID = SCNetworkServiceGetServiceID(service);
    CFStringRef primaryservicepath = CFStringCreateWithFormat(NULL,NULL,CFSTR("State:/Network/Service/%@/DNS"),interfaceServiceID);
    SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, CFSTR("DNSSETTING"), NULL, NULL);
    CFPropertyListRef propList = SCDynamicStoreCopyValue(dynRef,primaryservicepath);
    if (propList) {
        CFDictionaryRef dict = (CFDictionaryRef)propList;
        CFArrayRef addresses = (CFArrayRef)CFDictionaryGetValue(dict, CFSTR("ServerAddresses"));
        long addressesCount = CFArrayGetCount(addresses);
        for (long j = 0; j < addressesCount; j++) {
            CFStringRef address = (CFStringRef)CFArrayGetValueAtIndex(addresses, j);
            // Print address
            CFShow(address);
        }
        CFRelease(propList);
    }
    CFRelease(dynRef);
    CFRelease(primaryservicepath);
}
CFRelease(services);
CFRelease(prefsDNS);
于 2016-01-22T07:03:02.510 に答える
6

あなたがこれを必要としてから長い時間が経ったことは知っていますが、古い未解決の答えほど悪いものはありません. パーミッションの問題により、「/etc/resolv.conf」からはアクセスできません。多くの検索の後、少し運が良ければ、 res_ninit() 関数を介して取得できることがわかりました。

// Get native iOS System Resolvers
res_ninit(&_res);
res_state res = &_res;

for (int i = 0; i < res->nscount; i++) {
  sa_family_t family = res->nsaddr_list[i].sin_family;
  int port = ntohs(res->nsaddr_list[i].sin_port);
  if (family == AF_INET) { // IPV4 address
    char str[INET_ADDRSTRLEN]; // String representation of address
    inet_ntop(AF_INET, & (res->nsaddr_list[i].sin_addr.s_addr), str, INET_ADDRSTRLEN);
  } else if (family == AF_INET6) { // IPV6 address
    char str[INET6_ADDRSTRLEN]; // String representation of address
    inet_ntop(AF_INET6, &(res->nsaddr_list [i].sin_addr.s_addr), str, INET6_ADDRSTRLEN);
  }
}
res_ndestroy(res);
于 2014-11-17T21:19:30.160 に答える
5

SystemConfiguration フレームワークを使用できます。それはCにあります。

更新: Web の残りの部分は、思ったよりも使いにくいようです。キー「State:/Network/Service/ServiceID/DNS」を検索します。ServiceID はサービスの ID です。

于 2008-11-04T01:22:31.447 に答える
1

/etc/resolv.conf からも入手できます。

于 2008-11-07T01:14:30.883 に答える
-1

/etc/resolv.conf から読み取ることができます。

于 2008-11-07T01:17:11.500 に答える