Last active
May 3, 2020 18:13
-
-
Save doroshenko/6c191d2ea6bade40f0c740ce52347653 to your computer and use it in GitHub Desktop.
A simple local IPv4 address and mask retrieval in Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static var localIPAddress: (address: String?, mask: String?) { | |
let wifiInterface = "en0" | |
var address: String? | |
var mask: String? | |
var ifaddr: UnsafeMutablePointer<ifaddrs>? | |
guard getifaddrs(&ifaddr) == 0 else { | |
return (address: address, mask: mask) | |
} | |
var ptr = ifaddr | |
while ptr != nil { | |
defer { ptr = ptr?.pointee.ifa_next } | |
guard let interface = ptr?.pointee, | |
interface.ifa_addr.pointee.sa_family == UInt8(AF_INET), | |
String(cString: (interface.ifa_name)) == wifiInterface else { continue } | |
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) | |
address = String(cString: hostname) | |
var netmask = [CChar](repeating: 0, count: Int(NI_MAXHOST)) | |
getnameinfo(interface.ifa_netmask, socklen_t(interface.ifa_netmask.pointee.sa_len), &netmask, socklen_t(netmask.count), nil, socklen_t(0), NI_NUMERICHOST) | |
mask = String(cString: netmask) | |
} | |
freeifaddrs(ifaddr) | |
return (address: address, mask: mask) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment