经过多次试验和错误,但没有任何成功,看来我可能需要一些帮助:
如何在最新版本的 Swift 中从 sockaddr_in 获取 IP 地址和端口号?
我看到了一些相关的问题,但似乎在任何地方都找不到合适的例子。此外,我似乎并没有真正理解在 Swift 中需要如何处理 C 类型的结构和指针,这并没有真正的帮助。
谁能给我一个例子或有用资源的链接?
提前谢谢了!
经过多次试验和错误,但没有任何成功,看来我可能需要一些帮助:
如何在最新版本的 Swift 中从 sockaddr_in 获取 IP 地址和端口号?
我看到了一些相关的问题,但似乎在任何地方都找不到合适的例子。此外,我似乎并没有真正理解在 Swift 中需要如何处理 C 类型的结构和指针,这并没有真正的帮助。
谁能给我一个例子或有用资源的链接?
提前谢谢了!
如果您需要 IP 地址和端口作为数字,那么您可以直接访问 a 的相应字段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_in
和sockaddr_in6
)。
有关“不安全指针转换”的更多信息,请参阅 SE-0107 UnsafeRawPointer API 和UnsafeRawPointer 迁移。后一页包含如何在 Swift 3 中处理套接字地址的示例代码。