Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在swift中将sockaddr_in转换为sockaddr大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我试图在 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, &
我试图在 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,&rin,&rlen)

编译器在recvfrom上抱怨(非常密码)关于& rin是指向sockaddr_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,UInt(buffer.count),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,reinterpretCast(&rin),&rlen)

大佬总结

以上是大佬教程为你收集整理的如何在swift中将sockaddr_in转换为sockaddr全部内容,希望文章能够帮你解决如何在swift中将sockaddr_in转换为sockaddr所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。