經過多次試驗和錯誤,並沒有任何成功,似乎我可能需要在這一點上的幫助:從Swift的sockaddr_in結構中獲取IP地址和端口號?
我怎樣才能從sockaddr_in在最新版本的Swift中獲取IP地址和端口號?
我看到一些相關的問題,但似乎無法在任何地方找到正確的示例。另外,我似乎並不清楚C類型的結構和指針是如何在Swift中處理的,這並沒有什麼幫助。
任何人都可以請我提供一個例子或鏈接到有用的資源?
非常感謝提前!
經過多次試驗和錯誤,並沒有任何成功,似乎我可能需要在這一點上的幫助:從Swift的sockaddr_in結構中獲取IP地址和端口號?
我怎樣才能從sockaddr_in在最新版本的Swift中獲取IP地址和端口號?
我看到一些相關的問題,但似乎無法在任何地方找到正確的示例。另外,我似乎並不清楚C類型的結構和指針是如何在Swift中處理的,這並沒有什麼幫助。
任何人都可以請我提供一個例子或鏈接到有用的資源?
非常感謝提前!
如果您需要的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 API 和UnsafeRawPointer Migration。後者頁面包含示例代碼如何在Swift 3中處理 套接字地址。