如何在swift中将sockaddr_in转换为sockaddr

时间:2014-07-24 16:39:49

标签: swift sockets casting

我试图在swift中做一些网络代码,而且类型检查让我适合。

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

1 个答案:

答案 0 :(得分:5)

更新: 从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)