我想调用 Posix 套接字函数socket
and bind
来自斯威夫特。socket
很容易——需要Int32
s, but bind
造成了问题,因为我有一个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))
The bind
行无法编译:无法将类型“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, sockaddrPtr, UInt32(MemoryLayout<sockaddr_in>.stride))
}
本文可能有一些帮助。
(更新)
如中所述Martin R 显示的链接, now MemoryLayout<T>.stride
and MemoryLayout<T>.size
返回与C一致的相同值sizeof
,其中 T 是导入的 C 结构体。我会保留我的stride
答案的版本在这里,但现在在这种情况下这不是“必需的”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)