Error[8]: Undefined offset: 18, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在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", 
#include <ifaddrs.h>#include <net/if_dl.h>
)}.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}

您必须添加

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: { [+++].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: [+++] + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", [+++])}.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}

[+++]


)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 19, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在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", 
#include <ifaddrs.h>#include <net/if_dl.h>
)}.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}

您必须添加

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: { .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: [+++] + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", [+++])}.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}

[+++]


)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 20, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在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", 
#include <ifaddrs.h>#include <net/if_dl.h>
)}.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}

您必须添加

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: { .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:  + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", [+++])}.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}

[+++]


)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 21, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在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", 
#include <ifaddrs.h>#include <net/if_dl.h>
)}.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}

您必须添加

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: { .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:  + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", )}.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}

[+++]


)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
在Swift中也管理ifaddrs以返回MAC地址_随笔_内存溢出

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

在Swift中也管理ifaddrs以返回MAC地址,第1张

在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", 
#include <ifaddrs.h>#include <net/if_dl.h>
)}.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}

您必须添加

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: { .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:  + 8 + Int(dl.pointee.sdl_nlen),      count: Int(dl.pointee.sdl_alen))      if lladdr.count == 6 {          nameToMac[name] = lladdr.map { String(format:"%02hhx", )}.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}



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5087263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存