Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 连接到本地套接字_Swift_Sockets - Fatal编程技术网

Swift 连接到本地套接字

Swift 连接到本地套接字,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

我一直在尝试创建到本地套接字文件的连接,但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));
    }
}
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
,这是错误的,原因如下:

  • socketPath.characters.count
    不是UTF-8字节数 如果字符串包含非ASCII字符
  • 它不保证目标字符串以null结尾
  • 它可能会覆盖目标缓冲区
strncpy()

通常是更好的选择。

谢谢,这正是我想要的,了解strlcpy也很棒。
strncpy(dataPtr, socketPath, socketPath.characters.count)