【问题标题】:How do I get the currently connected network interface name using Cocoa or Foundation?如何使用 Cocoa 或 Foundation 获取当前连接的网络接口名称?
【发布时间】:2012-11-07 22:16:55
【问题描述】:

我需要知道当前连接的网络接口的网络接口名称,如en0lo0等。

是否有 Cocoa/Foundation 函数可以为我提供这些信息?

【问题讨论】:

    标签: objective-c macos cocoa networking core-foundation


    【解决方案1】:

    您可以循环访问网络接口并获取它们的名称、IP 地址等。

    #include <ifaddrs.h>
    // you may need to include other headers
    
    struct ifaddrs* interfaces = NULL;
    struct ifaddrs* temp_addr = NULL;
    
    // retrieve the current interfaces - returns 0 on success
    NSInteger success = getifaddrs(&interfaces);
    if (success == 0)
    {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL)
        {
          if (temp_addr->ifa_addr->sa_family == AF_INET) // internetwork only
          {
            NSString* name = [NSString stringWithUTF8String:temp_addr->ifa_name];
            NSString* address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
            NSLog(@"interface name: %@; address: %@", name, address);
          }
    
          temp_addr = temp_addr->ifa_next;
        }
    }
    
    // Free memory
    freeifaddrs(interfaces);
    

    上述结构中还有很多其他的标志和数据,希望你能找到你想要的。

    【讨论】:

    • 很好,会检查并在这里报告。
    【解决方案2】:

    由于 iOS 的工作方式与 OSX 稍有不同,我们很幸运地根据 Davyd 的回答使用以下代码查看 iPhone 上所有可用网络接口的名称:(also see here for full documentation on ifaddrs)

    #include <ifaddrs.h>
    
    struct ifaddrs* interfaces = NULL;
    struct ifaddrs* temp_addr = NULL;
    
    // retrieve the current interfaces - returns 0 on success
    NSInteger success = getifaddrs(&interfaces);
    if (success == 0)
    {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL)
        {
                NSString* name = [NSString stringWithUTF8String:temp_addr->ifa_name];
                NSLog(@"interface name: %@", name);
    
            temp_addr = temp_addr->ifa_next;
        }
    }
    
    // Free memory
    freeifaddrs(interfaces);
    

    【讨论】:

      【解决方案3】:

      您也可以使用if_indextoname() 来获取可用的接口名称。以下是 Swift 实现的样子:

      public func interfaceNames() -> [String] {
      
          let MAX_INTERFACES = 128;
      
          var interfaceNames = [String]()
          let interfaceNamePtr = UnsafeMutablePointer<Int8>.alloc(Int(IF_NAMESIZE))
          for interfaceIndex in 1...MAX_INTERFACES {
              if (if_indextoname(UInt32(interfaceIndex), interfaceNamePtr) != nil){
                  if let interfaceName = String.fromCString(interfaceNamePtr) {
                      interfaceNames.append(interfaceName)
                  }
              } else {
                  break
              }
          }
      
          interfaceNamePtr.dealloc(Int(IF_NAMESIZE))
          return interfaceNames
      }
      

      【讨论】:

        【解决方案4】:

        将@ambientlight 的示例代码移植到iOS 13:

        public func interfaceNames() -> [String] {
        
                let MAX_INTERFACES = 128;
        
                var interfaceNames = [String]()
                let interfaceNamePtr = UnsafeMutablePointer<Int8>.allocate(capacity: Int(Int(IF_NAMESIZE)))
                for interfaceIndex in 1...MAX_INTERFACES {
                    if (if_indextoname(UInt32(interfaceIndex), interfaceNamePtr) != nil){
                        let interfaceName = String(cString: interfaceNamePtr)
                        interfaceNames.append(interfaceName)
                    } else {
                        break
                    }
                }
        
                interfaceNamePtr.deallocate()
                return interfaceNames
            }
        

        很可能是内存泄漏 - 请谨慎使用。

        输出:

        ▿ 20 elements
          - 0 : "lo0"
          - 1 : "pdp_ip0"
          - 2 : "pdp_ip1"
          - 3 : "pdp_ip2"
          - 4 : "pdp_ip3"
          - 5 : "pdp_ip5"
          - 6 : "pdp_ip4"
          - 7 : "pdp_ip6"
          - 8 : "pdp_ip7"
          - 9 : "ap1"
          - 10 : "en0"
          - 11 : "en1"
          - 12 : "en2"
          - 13 : "ipsec0"
          - 14 : "ipsec1"
          - 15 : "ipsec2"
          - 16 : "ipsec3"
          - 17 : "awdl0"
          - 18 : "utun0"
          - 19 : "utun1"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-08
          • 2015-08-22
          • 2015-03-28
          • 2011-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多