Swift 连接到本地套接字
我一直在尝试创建到本地套接字文件的连接,但errno总是返回-1Swift 连接到本地套接字,swift,sockets,Swift,Sockets,我一直在尝试创建到本地套接字文件的连接,但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_u
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));
}
}
var socketPath=“/path/to/socket”
让sockDesc=socket(AF_本地,SOCK_流,0)
var address=sockaddr_un()
address.sun_family=UInt8(AF_本地)
address.sun_len=UInt8(位模式:Int8(MemoryLayout.size))
让dataPtr=unsafemeutablepointer(&address.sun\u path.0)
strncpy(dataPtr、socketPath、socketPath.characters.count)
let result=withUnsafePointer(指向:&地址){
$0.withMemoryRebound(收件人:sockaddr.self,容量:1){
连接(sockDesc,$0,socklen_t(MemoryLayout.stride));
}
}
套接字是有效的,因为在Qt中开发的另一个客户机可以愉快地连接到此路径
这里是否有明显的错误,或者应该这样做?connect()的第三个参数必须是实际大小 属于
sockaddr\u un
,而非“通用”sockaddr
。
略作简化:
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(MemoryLayout<sockaddr_un>.size)
strlcpy(&address.sun_path.0, socketPath, MemoryLayout.size(ofValue: address.sun_path))
let result = withUnsafePointer(to: &address) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
connect(sockDesc, $0, socklen_t(address.sun_len));
}
}
在代码中,将socketPath.characters.count
字节复制到
dataPtr
,这是错误的,原因如下:
不是UTF-8字节数 如果字符串包含非ASCII字符socketPath.characters.count
- 它不保证目标字符串以null结尾
- 它可能会覆盖目标缓冲区
strncpy()
通常是更好的选择。谢谢,这正是我想要的,了解strlcpy也很棒。
strncpy(dataPtr, socketPath, socketPath.characters.count)