如果您需要 IP 地址和端口numbers然后你可以
访问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
and sockaddr_in6
).
有关“不安全指针转换”的详细信息,请参阅SE-0107 不安全RawPointer API https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md
and 不安全RawPointer迁移 https://swift.org/migration-guide/se-0107-migrate.html。后一页包含如何处理的示例代码
Swift 3 中的套接字地址。