我正在尝试快速编写一些网络代码,类型检查让我很满意。
var sock: CInt = ...
var rin: sockaddr_in
var rlen = socklen_t(sizeof(sockaddr_in))
var buffer: CChar[] = CChar[](count: 128, repeatedValue: 0)
let len = recvfrom(sock, &buffer, 128, 0, &rin, &rlen)
编译器在 recvfrom
处(非常神秘地)提示 &rin
是指向 sockaddr_in
而不是 sockaddr 的指针
。我尝试了各种方法来转换指针类型,但我似乎无法做到这一点。
如果我将它声明为 sockaddr
,我可以编译它,但我不能将它视为 sockaddr_in
。
最佳答案
更新 Swift 3 及更高版本,比较UnsafeRawPointer Migration :
var sock: CInt = 1234
var rin = sockaddr_in()
var rlen = socklen_t(MemoryLayout.size(ofValue: rin))
var buffer = [CChar](repeating: 0, count: 128)
let len = withUnsafeMutablePointer(to: &rin) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
recvfrom(sock, &buffer, buffer.count, 0, $0, &rlen)
}
}
更新: 从 Swift 1.2(Xcode 6.3 beta)开始,初始化一个 C 结构 变得简单多了:
var rin = sockaddr_in()
定义一个 sockaddr_in
变量并将所有元素初始化为零。
将 sockaddr_in
地址转换为
sockaddr
是这样完成的:
let len = withUnsafeMutablePointer(&rin) {
recvfrom(sock, &buffer, UInt(buffer.count), 0, UnsafeMutablePointer($0), &rlen)
}
旧答案: 第一个问题是 sockaddr_in
变量必须先初始化
它的地址可以传递给 recvfrom()
。在 Swift 中初始化复杂结构
好像比较笨拙,对比一下
使用来自的辅助函数 https://stackoverflow.com/a/24335355/1187415 :
func initStruct<S>() -> S {
let struct_pointer = UnsafeMutablePointer<S>.alloc(1)
let struct_memory = struct_pointer.move()
struct_pointer.dealloc(1)
return struct_memory
}
套接字地址可以初始化为
var rin : sockaddr_in = initStruct()
要将 sockaddr_in
指针转换为 sockaddr
指针,请使用 reinterpretCast()
。
let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen)
关于swift - 如何快速将 sockaddr_in 转换为 sockaddr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24939431/