Адаптер Thunderbolt-Ethernet не найден в Swift с использованием getifaddrs()

У меня есть следующий код, чтобы получить список всех адаптеров на моем MacBook:

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-Ethernet, эта сеть не возвращается.

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


person inexcitus    schedule 19.11.2016    source источник


Ответы (1)


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

Вот пример того, как пройти по списку и сохранить имена интерфейсов в массиве (модификация кода в Как получить IP-адрес в 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
}

На моем iMac это дает

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

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

"lo0", "gif0", "stf0", "en1"
person Martin R    schedule 19.11.2016
comment
Спасибо, я попробую это. - person inexcitus; 19.11.2016