2017-01-05 258 views
0

经过多次试验和错误,并没有任何成功,似乎我可能需要在这一点上的帮助:从Swift的sockaddr_in结构中获取IP地址和端口号?

我怎样才能从sockaddr_in在最新版本的Swift中获取IP地址和端口号?

我看到一些相关的问题,但似乎无法在任何地方找到正确的示例。另外,我似乎并不清楚C类型的结构和指针是如何在Swift中处理的,这并没有什么帮助。

任何人都可以请我提供一个例子或链接到有用的资源?

非常感谢提前!

回答

2

如果您需要的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指针 被称为“重新绑定”斯威夫特,并完成与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和)。

有关“不安全指针转换”的详细信息,请参阅 SE-0107 UnsafeRawPointer APIUnsafeRawPointer Migration。后者页面包含示例代码如何在Swift 3中处理 套接字地址。