栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Swift中也管理ifaddrs以返回MAC地址

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Swift中也管理ifaddrs以返回MAC地址

备注/说明: 这是对 “管理ifaddrs在Swift中也返回MAC地址”“是否可以修改
如何快速获取Ip地址中
的代码
以也返回MAC地址” 的问题的答案 这不是 “检索连接到我的路由器的所有IP” 的解决方案,
问题正文中也提到了该解决方案。)

这是参考代码的扩展,该代码以 (接口名称,ip地址,MAC地址) 元组的数组形式返回本地(正在运行的接口
。从类型的接口检索MAC地址,这些接口

AF_link

作为
sockaddr_dl
结构存储在接口列表中。这是一个可变长度的结构,Swift的严格类型系统使指针变乱成为必要。

重要说明: 该代码旨在在Mac计算机上运行。在iOS设备上获取MAC地址不起作用。为了保护隐私,iOS 故意 为所有接口的硬件地址返回“02:00:00:00:00:00”作为硬件地址,

func getInterfaces() -> [(name : String, addr: String, mac : String)] {    var addresses = [(name : String, addr: String, mac : String)]()    var nameToMac = [ String : String ]()    // Get list of all interfaces on the local machine:    var ifaddr : UnsafeMutablePointer<ifaddrs> = nil    if getifaddrs(&ifaddr) == 0 {        // For each interface ...        var ptr = ifaddr        while ptr != nil { defer { ptr = ptr.memory.ifa_next } let flags = Int32(ptr.memory.ifa_flags) let addr = ptr.memory.ifa_addr if let name = String.fromCString(ptr.memory.ifa_name)  {     // Check for running IPv4, IPv6 interfaces. Skip the loopback interface.     if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {         if addr.memory.sa_family == UInt8(AF_link) {  // Get MAC address from sockaddr_dl structure and store in nameToMac dictionary:  let dl = UnsafePointer<sockaddr_dl>(ptr.memory.ifa_addr)  let lladdr = UnsafeBufferPointer(start: UnsafePointer<Int8>(dl) + 8 + Int(dl.memory.sdl_nlen),  count: Int(dl.memory.sdl_alen))  if lladdr.count == 6 {      nameToMac[name] = lladdr.map { String(format:"%02hhx", $0)}.joinWithSeparator(":")  }         }         if addr.memory.sa_family == UInt8(AF_INET) || addr.memory.sa_family == UInt8(AF_INET6) {  // Convert interface address to a human readable string:  var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)  if (getnameinfo(addr, socklen_t(addr.memory.sa_len), &hostname, socklen_t(hostname.count),      nil, socklen_t(0), NI_NUMERICHOST) == 0) {      if let address = String.fromCString(hostname) {          addresses.append( (name: name, addr: address, mac : "") )      }  }         }     } }        }        freeifaddrs(ifaddr)    }    // Now add the mac address to the tuples:    for (i, addr) in addresses.enumerate() {        if let mac = nameToMac[addr.name] { addresses[i] = (name: addr.name, addr: addr.addr, mac : mac)        }    }    return addresses}

您必须添加

#include <ifaddrs.h>#include <net/if_dl.h>

到桥接头文件进行编译。

用法示例:

for addr in getInterfaces() {   print(addr)}// ("en0", "fe80::1234:7fff:fe2e:8765%en0", "a9:55:6f:2e:57:78")// ("en0", "192.168.2.108", "a9:55:6f:2e:57:78")// ...

Swift 3(Xpre 8)更新:

func getInterfaces() -> [(name : String, addr: String, mac : String)] {    var addresses = [(name : String, addr: String, mac : String)]()    var nameToMac = [ String: 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 flags = Int32(ptr.pointee.ifa_flags)        if let addr = ptr.pointee.ifa_addr { let name = String(cString: ptr.pointee.ifa_name) // Check for running IPv4, IPv6 interfaces. Skip the loopback interface. if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {     switch Int32(addr.pointee.sa_family) {     case AF_link:         // Get MAC address from sockaddr_dl structure and store in nameToMac dictionary:         addr.withMemoryRebound(to: sockaddr_dl.self, capacity: 1) { dl in  dl.withMemoryRebound(to: Int8.self, capacity: 8 + Int(dl.pointee.sdl_nlen + dl.pointee.sdl_alen)) {      let lladdr = UnsafeBufferPointer(start: $0 + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", $0)}.joined(separator: ":")      }  }         }     case AF_INET, AF_INET6:         // Convert interface address to a human readable string:         var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))         if (getnameinfo(addr, socklen_t(addr.pointee.sa_len),   &hostname, socklen_t(hostname.count),   nil, socklen_t(0), NI_NUMERICHOST) == 0) {  let address = String(cString: hostname)  addresses.append( (name: name, addr: address, mac : "") )         }     default:         break     } }        }    }    freeifaddrs(ifaddr)    // Now add the mac address to the tuples:    for (i, addr) in addresses.enumerated() {        if let mac = nameToMac[addr.name] { addresses[i] = (name: addr.name, addr: addr.addr, mac : mac)        }    }    return addresses}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426962.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号