从 Swift 中的 sockaddr_in 结构中获取 IP 地址和端口号



经过多次试验和错误,没有任何成功,似乎我可能需要一些帮助:

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

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

任何人都可以为我提供示例或链接到有用的资源吗?

提前非常感谢!

如果您需要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 不安全的原始指针 API和不安全的原始指针迁移。后一页包含如何处理的示例代码Swift 3 中的套接字地址。

相关内容

  • 没有找到相关文章

最新更新