2016-11-21 73 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上實際上沒有任何其他配置。