从 Swift 中的 sockaddr_in 结构获取 IP 地址和端口号?
Getting an IP address and port number from a sockaddr_in struct in Swift?
经过多次尝试和错误,但没有成功,看来我可能需要一些帮助:
如何从最新版本的 Swift 中的 sockaddr_in 获取 IP 地址和端口号?
我看到了一些相关的问题,但似乎无法在任何地方找到合适的例子。另外,我似乎不太明白在 Swift 中需要如何处理 C 类型的结构和指针,这并没有什么帮助。
任何人都可以提供示例或 link 有用的资源吗?
非常感谢!
如果你需要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 中称为 "rebinding",并用 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) {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 0) {
_ = getnameinfo([=11=], socklen_t([=11=].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
)。
有关 "unsafe pointer conversions" 的详细信息,请参阅
SE-0107 UnsafeRawPointer API
和 UnsafeRawPointer Migration。后一页包含示例代码如何处理
Swift 3.
中的套接字地址
经过多次尝试和错误,但没有成功,看来我可能需要一些帮助:
如何从最新版本的 Swift 中的 sockaddr_in 获取 IP 地址和端口号?
我看到了一些相关的问题,但似乎无法在任何地方找到合适的例子。另外,我似乎不太明白在 Swift 中需要如何处理 C 类型的结构和指针,这并没有什么帮助。
任何人都可以提供示例或 link 有用的资源吗?
非常感谢!
如果你需要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 中称为 "rebinding",并用 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) {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 0) {
_ = getnameinfo([=11=], socklen_t([=11=].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
)。
有关 "unsafe pointer conversions" 的详细信息,请参阅 SE-0107 UnsafeRawPointer API 和 UnsafeRawPointer Migration。后一页包含示例代码如何处理 Swift 3.
中的套接字地址