2016-11-21 14 views
0

エンドユーザが理解できる名前のアクティブなネットワークインタフェースのリストを取得しようとしています。 en0en5の代わりに、システム環境設定にリストされている名前と同じです。ネットワークインタフェース名を変換

私は​​を使用している生のインターフェイスを持っていますが、それらを取得し、EthernetまたはWifiのシステム名を取得する方法を見つけることができませんでした。

誰でもこの方法を知っていますか?これはmacOSのためのものです。私が今持っている何

struct ifaddrs *ifap; 
    if(getifaddrs(&ifap) == 0){ 
     struct ifaddrs *interface; 

     for (interface = ifap; interface != NULL; interface = interface->ifa_next) { 
      unsigned int flags = interface->ifa_flags; 
      struct sockaddr *addr = interface->ifa_addr; 

      // Check for running IPv4, IPv6 interfaces. Skip the loopback interface. 
      if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) { 
       if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) { 

        // Convert interface address to a human readable string: 
        char host[NI_MAXHOST]; 
        getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST); 

        printf("interface:%s, address:%s\n", interface->ifa_name, host); 
        // MAGIC HERE TO CONVERT ifa_name to "Ethernet" or something 
       } 

      } 
     } 
     freeifaddrs(ifap); 

答えて

2

これはMacOSでシステム構成で可能です。 Objective-Cでこれと同様:

CFArrayRef ref = SCNetworkInterfaceCopyAll(); 
    NSArray* networkInterfaces = (__bridge NSArray *)(ref); 
    for(int i = 0; i < networkInterfaces.count; i += 1) { 
     SCNetworkInterfaceRef interface = (__bridge SCNetworkInterfaceRef)(networkInterfaces[i]); 

     CFStringRef displayName = SCNetworkInterfaceGetLocalizedDisplayName(interface); 
     CFStringRef bsdName = SCNetworkInterfaceGetBSDName(interface); 
     NSLog(@"Name:%@ \ninterface: %@\nbsd:%@",displayName, SCNetworkInterfaceGetInterfaceType(interface), bsdName); 

    } 

ローカライズされた表示名がDisplay Ethernet又はWiFiようなものであろうとBSD名は、上記のコードに一致することを可能にするen5ようなものであろう。

このアプローチはiOSでは機能しませんが、iOSでは実際には他の設定はありません。

関連する問題