2016-11-21 2 views
0

Я пытаюсь получить список активных сетевых интерфейсов с понятными именами конечного пользователя. Как имена, перечисленные в системных настройках, а не en0en5.Convert Network Interface Name

У меня есть необработанные интерфейсы, используя getifaddrs, но не смогли найти, как их взять и получить системные имена 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 нет других конфигураций.

Смежные вопросы