Skip to content

Instantly share code, notes, and snippets.

@doroshenko
Last active May 3, 2020 18:13
Show Gist options
  • Save doroshenko/6c191d2ea6bade40f0c740ce52347653 to your computer and use it in GitHub Desktop.
Save doroshenko/6c191d2ea6bade40f0c740ce52347653 to your computer and use it in GitHub Desktop.
A simple local IPv4 address and mask retrieval in Swift
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