【问题标题】:How to cast sockaddr_in to sockaddr in swift如何快速将 sockaddr_in 转换为 sockaddr
【发布时间】:2014-07-24 16:39:49
【问题描述】:

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

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 sockets casting


    【解决方案1】:

    更新 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
    }
    

    socket地址可以初始化为

    var rin : sockaddr_in = initStruct()
    

    要将sockaddr_in 指针转换为sockaddr 指针,请使用reinterpretCast()

    let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen)
    

    【讨论】:

    • 你有 let len = withUnsafeMutablePointer(&amp;rin)... 的 Swift 5 版本吗?由于模棱两可而失败。
    • @shallowThought:我已经更新了代码。
    • 谢谢,有帮助!稍微解释一下就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2018-12-19
    • 2014-02-01
    • 2012-07-25
    • 2012-07-28
    相关资源
    最近更新 更多