更新 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
}
socket地址可以初始化为
var rin : sockaddr_in = initStruct()
要将sockaddr_in 指针转换为sockaddr 指针,请使用reinterpretCast()。
let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen)