Skip to content

Instantly share code, notes, and snippets.

@T1T4N
Created June 21, 2022 09:31
Show Gist options
  • Save T1T4N/271fdf49facc51842d5ad2d880b1b9c8 to your computer and use it in GitHub Desktop.
Save T1T4N/271fdf49facc51842d5ad2d880b1b9c8 to your computer and use it in GitHub Desktop.
Query internal iOS IP addresses from all interfaces and return them in a Swift-friendly structure
struct IPData {
var address: String
var family: UInt8
var interface: String
}
func getIpAddresses() -> [IPData] {
var addresses: [IPData] = []
// Get list of all interfaces on the local machine:
var ifaddr: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&ifaddr) == 0 else { return addresses }
guard let firstAddr = ifaddr else { return addresses }
defer { freeifaddrs(ifaddr) }
// Enumerate interfaces
for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
let interface = ifptr.pointee
// Check for IPv4 or IPv6 interface:
let addrFamily = interface.ifa_addr.pointee.sa_family
guard addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) else { continue }
let name = String(cString: interface.ifa_name)
guard [
// Cellular
"pdp_ip0", "pdp_ip1", "pdp_ip2", "pdp_ip3",
// Wired
"en2", "en3", "en4",
// Wi-Fi
"en0"
].contains(name) else { continue }
// Convert interface address to a human readable string
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),
&hostname, socklen_t(hostname.count),
nil, socklen_t(0), NI_NUMERICHOST)
let address = String(cString: hostname)
addresses.append(.init(address: address, family: addrFamily, interface: name))
}
return addresses
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment