如何将sockaddr_in转换为swck中的sockaddr [英] How to cast sockaddr_in to sockaddr in swift
问题描述
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> $ 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屋!