swift - 如何快速将 sockaddr_in 转换为 sockaddr

标签 swift sockets casting

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

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/

相关文章:

ios - 将 JSON 响应概括为函数参数

sql - 将 VarChar 转换为具有不同文化格式的 Float

ios - 如何使 UIScrollView 的 subview 居中

swift - 打开 UIImage 时意外发现 nil

无法通过套接字连接到 HTTP 服务 - C

sockets - UDP(单播客户端)是否可以从一个sendto()之外的其他服务器接收revfrom()?

Java 强制转换为父类(super class)并调用重载方法

java - 对泛型参数类型的错误转换不会在 Java 中抛出 ClassCastException

swift - 无法使用 alpha 属性调用非函数类型 'CGFloat' 的值

java - 聊天服务器 - 实现选项