我想调用Posix套接字函数套接字并从Swift绑定. socket很简单 – 它需要Int32s,但是绑定导致了一个问题,因为我有一个sockaddr_in指针,但它需要一个sockaddr指针.在C中,这将是一个演员,如:
bind(sock,(struct sockaddr *)&sockAddress,sizeof(sockAddress))
这是Swift的一次尝试:
let sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP) var sockAddress = sockaddr_in() bind(sock,&sockAddress,UInt32(MemoryLayout<sockaddr_in>.size))
绑定行无法编译:无法将’sockaddr_in’类型的值转换为预期的参数类型’sockaddr’
如何投射指针?
你可以写这样的东西:
withUnsafePointer(to: &sockAddress) {sockaddrInPtr in sockaddrInPtr.withMemoryRebound(to: sockaddr.self,capacity: 1) {sockaddrPtr in bind(sock,sockaddrPtr,UInt32(MemoryLayout<sockaddr_in>.stride)) } }
或者有人建议这可能会更好:
withUnsafePointer(to: &sockAddress) {sockaddrInPtr in let sockaddrPtr = UnsafeRawPointer(sockaddrInPtr).assumingMemoryBound(to: sockaddr.self) bind(sock,UInt32(MemoryLayout<sockaddr_in>.stride)) }
This article可能会有所帮助.
(UPDATE)
如the link shown by Martin R中所述,现在MemoryLayout< T> .stride和MemoryLayout< T> .size返回与C的sizeof一致的相同值,其中T是导入的C结构.我会在这里保留我的答案版本,但在这种情况下,这不是“必需”.