在使用swift获取iOS上的默认网关IP时遇到一些问题。我在苹果商店中找到了一个名为“ Net Analyzer”的应用程序,该应用程序可以获取默认网关IP,如下图所示。
在屏幕快照上,您可以看到默认网关IP,DNS服务器IP和设备IP地址。谁能给我一个提示,怎么做?
当前,我可以获取设备接口来获取设备IP,但是我想获取设备所连接的默认网关。
我正在使用当前代码来获取接口地址
func getIFAddresses() -> [String] {
var addresses = [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)
let addr = ptr.pointee.ifa_addr.pointee
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) &&
(addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6)) {
// Convert interface address to a human readable string:
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if (getnameinfo(ptr.pointee.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),
nil, socklen_t(0), NI_NUMERICHOST) == 0) {
let address = String(cString: hostname)
addresses.append(address)
}
}
}
freeifaddrs(ifaddr)
return addresses
}
顺便问一下,有什么方法可以将Wi-Fi接口与移动网络接口区分开吗?
答案 0 :(得分:1)
如果您能够使用iOS≥12,则可以使用Network
框架。
从NWPath
获得的NWPathMonitor.pathUpdateHandler
会将NWPath.gateways
变量设置为网关IP。
let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
monitor.pathUpdateHandler = { path in
print(path.gateways)
}
monitor.start(queue: DispatchQueue(label: "nwpathmonitor.queue"))
ptr.pointee.ifa_name
包含接口名称。 WiFi接口的接口名称为en0
,单元接口的接口名称为pdp_ip0
。它是cString
,因此let interfaceName = String(cString: ptr.pointee.ifa_name)
会将其转换为快速String
。