我一直在尝试创建到本地套接字文件的连接,但 errno 总是返回 -1
var socketPath = "/path/to/socket"
let sockDesc = socket(AF_LOCAL, SOCK_STREAM, 0)
var address = sockaddr_un()
address.sun_family = UInt8(AF_LOCAL)
address.sun_len = UInt8(bitPattern:Int8(MemoryLayout<sockaddr_un>.size))
let dataPtr = UnsafeMutablePointer<Int8>(&address.sun_path.0)
strncpy(dataPtr, socketPath, socketPath.characters.count)
let result = withUnsafePointer(to: &address) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
connect(sockDesc, $0, socklen_t(MemoryLayout<sockaddr>.stride));
}
}
Run Code Online (Sandbox Code Playgroud)
套接字是有效的,作为用 Qt 开发的另一个客户端可以愉快地连接到该路径。
这里有明显的错误吗?或者这应该有效吗?
的第三个参数connect()必须是 的实际大小sockaddr_un,而不是“generic”的实际大小sockaddr。经过一些小的简化:
let socketPath = "/path/to/socket"
let sockDesc = socket(AF_LOCAL, SOCK_STREAM, 0)
var address = sockaddr_un()
address.sun_family = UInt8(AF_LOCAL)
address.sun_len = UInt8(MemoryLayout<sockaddr_un>.size)
strlcpy(&address.sun_path.0, socketPath, MemoryLayout.size(ofValue: address.sun_path))
let socklen = socklen_t(address.sun_len)
let result = withUnsafePointer(to: &address) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
connect(sockDesc, $0, socklen);
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意
strncpy(dataPtr, socketPath, socketPath.characters.count)
Run Code Online (Sandbox Code Playgroud)
在您的代码中将socketPath.characters.count字节复制到
dataPtr,这是错误的,原因有几个:
socketPath.characters.count如果字符串包含非 ASCII 字符,则不是 UTF-8 字节数,strncpy()很容易被误用,并且strlcpy()(如果有的话)通常是更好的选择。
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |