【问题标题】:Getting an IP address and port number from a sockaddr_in struct in Swift?从 Swift 中的 sockaddr_in 结构中获取 IP 地址和端口号?
【发布时间】:2017-01-05 20:49:30
【问题描述】:

经过多次尝试和错误,但没有任何成功,看来我可能需要一些帮助:

如何在最新版本的 Swift 中从 sockaddr_in 获取 IP 地址和端口号?

我看到了一些相关的问题,但似乎无法在任何地方找到合适的示例。另外,我似乎并不真正了解在 Swift 中需要如何处理 C 类型的结构和指针,这并没有真正的帮助。

谁能给我一个示例或有用资源的链接?

提前非常感谢!

【问题讨论】:

    标签: swift sockets sockaddr-in


    【解决方案1】:

    如果您需要 IP 地址和端口作为 数字,那么您可以 直接访问sockaddr_in 的相应字段,但是 记得将值从网络字节(大端)转换为主机 字节顺序:

    let saddr: sockAddr = ...
    
    let port = in_port_t(bigEndian: sockAddr.sin_port)
    let addr = in_addr_t(bigEndian: sockAddr.sin_addr.s_addr)
    

    getnameinfo() 可用于将 IP 地址提取为字符串 (点分十进制表示法),以及可选的端口。 将 struct sockaddr_in 指针转换为 struct sockaddr 指针 在 Swift 中被称为“重新绑定”,使用 withMemoryRebound() 完成:

    var sockAddr: sockaddr_in = ...
    
    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
    var service = [CChar](repeating: 0, count: Int(NI_MAXSERV))
    
    withUnsafePointer(to: &sockAddr) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 0) {
            _ = getnameinfo($0, socklen_t($0.pointee.sa_len),
                            &hostname, socklen_t(hostname.count),
                            &service, socklen_t(service.count),
                            NI_NUMERICHOST | NI_NUMERICSERV)
        }
    }
    print("addr:", hostname)
    print("port:", service)
    

    这适用于 IPv4 和 IPv6 套接字地址结构(sockaddr_insockaddr_in6)。

    有关“不安全的指针转换”的更多信息,请参阅 SE-0107 UnsafeRawPointer APIUnsafeRawPointer Migration。后一页包含如何处理的示例代码 Swift 3 中的套接字地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2020-05-19
      • 2012-09-30
      相关资源
      最近更新 更多