gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:36:04 46 4
gpt4 key购买 nike

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

如何在最新版本的 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 中称为“重新绑定(bind)”,并使用 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 中的套接字地址。

关于swift - 从 Swift 中的 sockaddr_in 结构获取 IP 地址和端口号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494466/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com