我正在尝试快速编写一些网络代码,而类型检查正适合我。

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,说&rinsockaddr_in的指针,而不是sockaddr的指针。我尝试了各种方法来转换指针类型,但是似乎无法正确实现。

如果我将其声明为sockaddr,则可以对其进行编译,但是我无法将其视为sockaddr_in

最佳答案

更新:从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中初始化复杂结构
似乎笨拙,比较
  • Swift: Pass Uninitialized C Structure to Imported C function

  • 使用以下的辅助功能
    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)
    

    10-06 05:11
    查看更多