2016-11-19 8 views
0

Я следующий код, чтобы получить список всех адаптеров на моем MacBook:Thunderbolt адаптер Ethernet не найден в Swift с использованием getifaddrs()

if getifaddrs(&addresses) == 0 
     { 
      let buffer = UnsafeBufferPointer(start: addresses, count: 16) 
      for address in buffer 
      { 
       let rawData = address.ifa_data 
       let name = address.ifa_name 
       let socket: sockaddr = address.ifa_addr.pointee 

       if rawData != nil && name != nil && socket.sa_family == UInt8(AF_LINK) 
       { 
        let adapterName = String(utf8String: UnsafePointer<CChar>(name!)) 
        let adapter = Adapter(name: adapterName!) 
        adapters.append(adapter) 
       } 
      } 
     } 

код прекрасно работает и (почти) возвращаются все адаптеры , Если используется адаптер Thunderbolt to Ethernet, эта сеть не возвращается.

Как я могу получить этот адаптер?

ответ

0

Ваш код предполагает, что getifaddrs() возвращает массив из struct ifaddrs, и это не так. Функция хранит ссылку на связанный список по указанному адресу, с номером ifa_next, указывающим следующему элементу (или nil для последнего элемента).

Вот пример того, как пройти через этот список и хранить интерфейсной имена в массив (модификация кода How to get Ip address in swift):

func getInterfaceNames() -> [String] { 

    var names = [String]() 

    // Get list of all interfaces on the local machine: 
    var ifaddr : UnsafeMutablePointer<ifaddrs>? 
    guard getifaddrs(&ifaddr) == 0 else { return [] } 
    guard let firstAddr = ifaddr else { return [] } 

    // For each interface ... 
    for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) { 
     let addr = ptr.pointee.ifa_addr.pointee 
     if addr.sa_family == UInt8(AF_LINK) { 
      let name = String(cString: ptr.pointee.ifa_name) 
      names.append(name) 
     } 
    } 

    return names 
} 

На мой компьютер, это дает

["lo0", "gif0", "stf0", "en1", "en2", "en3", "p2p0", "awdl0", "en0", "bridge0", "utun0"] 

включая «мост0» для моста Thunderbolt, тогда как ваш код только возвращает

"lo0", "gif0", "stf0", "en1" 
+0

Спасибо, я попробую это. –