如何将sockaddr_in转换为swck中的sockaddr [英] How to cast sockaddr_in to sockaddr in swift

查看:683
本文介绍了如何将sockaddr_in转换为swck中的sockaddr的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  var sock:我想在swift中做一些网络代码, 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 中抱怨($ cr $ c>& rin $ c>是指向 sockaddr_in 而不是 sockaddr 的指针。我尝试了各种方法来转换指针类型,但我似乎不能得到这个正确。



如果我声明它是一个 sockaddr 我可以得到这个编译,但是我不能看它作为 sockaddr_in

解决方案

更新: 从Swift 1.2(Xcode 6.3测试版),初始化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中初始化复杂的结构
似乎很笨拙,比较





使用
中的帮助函数 http://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 指针的 sockaddr_in 指针,使用 reinterpretCast()

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


I'm trying to do some network code in swift and the type checking is giving me fits.

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)

The compiler complains (very cryptically) at the recvfrom about the fact that &rin is a pointer to sockaddr_in instead of sockaddr. I tried various ways to convert the pointer type, but I can't seem to get this right.

If I declare it to be a sockaddr I can get this to compile, but then I can't look at it as a sockaddr_in.

解决方案

Update: As of Swift 1.2 (Xcode 6.3 beta), initializing a C struct has become much simpler:

var rin = sockaddr_in()

defines a sockaddr_in variable and initializes all elements to zero. The conversion of a address of sockaddr_in to an an address of sockaddr is done as follows:

let len = withUnsafeMutablePointer(&rin) {
    recvfrom(sock, &buffer, UInt(buffer.count), 0, UnsafeMutablePointer($0), &rlen)
}


Old answer: The first problem is that the sockaddr_in variable has to be initialized before its address can be passed to recvfrom(). Initializing complex structs in Swift seems to be clumsy, compare

Using the helper function from http://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
}

the socket address can be initialized as

var rin : sockaddr_in = initStruct()

To cast the sockaddr_in pointer to a sockaddr pointer, use reinterpretCast().

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

这篇关于如何将sockaddr_in转换为swck中的sockaddr的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆