Skip to content

Instantly share code, notes, and snippets.

@trickart
Last active October 2, 2023 09:10
Show Gist options
  • Save trickart/98f2682b8171b042f029c54a61ce37ac to your computer and use it in GitHub Desktop.
Save trickart/98f2682b8171b042f029c54a61ce37ac to your computer and use it in GitHub Desktop.
Get Interface IP Addresses
// https://ja.stackoverflow.com/questions/60182/swift-ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%A8%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E3%83%B3%E3%82%B0%E3%83%98%E3%83%83%E3%83%80%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
func getInterfaceAddresses() -> [String: String] {
var first: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&first) == 0,
let firstAddrs = first else { return [:] }
defer { freeifaddrs(first) }
var addresses: [String: String] = [:]
for current in sequence(first: firstAddrs, next: \.pointee.ifa_next) {
let addressFamily = current.pointee.ifa_addr.pointee.sa_family
if addressFamily == UInt8(AF_INET) || addressFamily == UInt8(AF_INET6) {
var address = current.pointee.ifa_addr.pointee
var addressChars: [CChar] = Array(repeating: .zero, count: Int(NI_MAXHOST))
getnameinfo(&address, socklen_t(address.sa_len),
&addressChars, socklen_t(addressChars.count),
nil, 0,
NI_NUMERICHOST)
let interfaceName = String(cString: current.pointee.ifa_name)
addresses[interfaceName] = String(cString: addressChars)
}
}
return addresses
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment