Mat*_*att 5 sockets casting swift
我试图在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, 0, &rin, &rlen)
Run Code Online (Sandbox Code Playgroud)
编译器抱怨(非常密码)recvfrom关于&rin指向sockaddr_in而不是指针的事实sockaddr.我尝试了各种方法来转换指针类型,但我似乎无法做到这一点.
如果我声明它是一个sockaddr我可以得到这个编译,但后来我不能把它看作一个sockaddr_in.
更新:从Swift 1.2(Xcode 6.3 beta)开始,初始化C结构变得更加简单:
var rin = sockaddr_in()
Run Code Online (Sandbox Code Playgroud)
定义一个sockaddr_in变量并将所有元素初始化为零.地址sockaddr_in到
地址的转换sockaddr完成如下:
let len = withUnsafeMutablePointer(&rin) {
recvfrom(sock, &buffer, UInt(buffer.count), 0, UnsafeMutablePointer($0), &rlen)
}
Run Code Online (Sandbox Code Playgroud)
旧答案:第一个问题是sockaddr_in变量必须在其地址传递到之前进行初始化recvfrom().比较,在Swift中初始化复杂结构似乎很笨拙
使用/sf/answers/1703474881/中的帮助程序功能 :
func initStruct<S>() -> S {
let struct_pointer = UnsafeMutablePointer<S>.alloc(1)
let struct_memory = struct_pointer.move()
struct_pointer.dealloc(1)
return struct_memory
}
Run Code Online (Sandbox Code Playgroud)
套接字地址可以初始化为
var rin : sockaddr_in = initStruct()
Run Code Online (Sandbox Code Playgroud)
要将sockaddr_in指针强制转换为sockaddr指针,请使用reinterpretCast().
let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3205 次 |
| 最近记录: |