Files
Schedule-ICTIS/Carthage/Checkouts/TrueTime.swift/Sources/SocketAddress.swift
Vladimir Dubovik 5abafda21b Commit
2025-06-13 11:59:16 +03:00

70 lines
1.8 KiB
Swift

//
// SocketAddress.swift
// TrueTime
//
// Created by Michael Sanders on 9/14/16.
// Copyright © 2016 Instacart. All rights reserved.
//
import Foundation
enum SocketAddress {
case iPv4(sockaddr_in)
case iPv6(sockaddr_in6)
init?(storage: UnsafePointer<sockaddr_storage>, port: UInt16? = nil) {
switch Int32(storage.pointee.ss_family) {
case AF_INET:
self = storage.withMemoryRebound(to: sockaddr_in.self, capacity: 1) { pointer in
var addr = pointer.pointee.nativeEndian
addr.sin_port = port ?? addr.sin_port
return .iPv4(addr)
}
case AF_INET6:
self = storage.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) { pointer in
var addr = pointer.pointee.nativeEndian
addr.sin6_port = port ?? addr.sin6_port
return .iPv6(addr)
}
default: return nil
}
}
var family: Int32 {
switch self {
case .iPv4: return PF_INET
case .iPv6: return PF_INET6
}
}
var networkData: Data {
switch self {
case .iPv4(let address): return address.bigEndian.data as Data
case .iPv6(let address): return address.bigEndian.data as Data
}
}
var host: String {
switch self {
case .iPv4(let address): return address.description
case .iPv6(let address): return address.description
}
}
}
extension SocketAddress: CustomStringConvertible {
var description: String {
return host
}
}
extension SocketAddress: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(host.hashValue)
}
}
func == (lhs: SocketAddress, rhs: SocketAddress) -> Bool {
return lhs.host == rhs.host
}