2016-11-21 53 views
0

我正在尝试以最终用户可理解的名称获取活动网络接口的列表。与系统偏好设置中列出的名称一样,而不是en0en5转换网络接口名称

我有使用​​的原始接口,但一直未能找到如何使用这些接口并获得EthernetWifi的系统名称。

任何人都知道如何做到这一点?这将是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 EthernetWiFi和BSD名称将是类似en5这将允许匹配到上面的代码。

这种方法在iOS上不起作用,但是iOS上实际上没有任何其他配置。