同一台机器上的进程通信,Unix 域套接字比 TCP 回环好在哪?它的地址是文件,带来哪些坑?这篇验证套接字文件、残留文件错误、路径长度限制、socketpair,并把延迟和吞吐与 TCP 回环对比。
编译:成功
运行(退出码 0):
bind 之后路径上出现了一个文件:is_socket = true,权限 755
服务端:对端地址 None(客户端没有 bind,是未命名的)
客户端:收到 "你好 uds"
listener 已经 drop,但套接字文件还在: true(需要自己删除)TCP 版本见TCP Listener 与 TcpStream;文件描述符的释放见文件描述符与资源释放。
编译:成功
运行(退出码 0):
上一个 listener 已经退出,文件还在: true
再 bind 同一个路径:Err((AddrInUse, Some(48)))
connect 到这个没人监听的残留文件:Err((ConnectionRefused, Some(61)))
删除文件后 bind: Ok("成功")
connect 到不存在的路径:Err((NotFound, Some(2))) 编译:成功
运行(退出码 0):
目录部分 53 字节;文件名最长 49 字节时 bind 成功,总路径长度 103 字节;文件名 50 字节(总长 104)失败:Err("path must be shorter than SUN_LEN")macOS 的 sun_path 是 104 字节,Linux 是 108 字节,这里只验证了 macOS。
编译:成功
运行(退出码 0):
UnixStream::pair:a 写 ping,b 读到 "ping";a 的地址 None
UnixDatagram:发 3 字节与 2 字节,两次 recv 分别得到 3 与 2 字节(边界保留) 编译:成功
运行(退出码 0):
往返延迟:Unix 域套接字 4.7 µs,TCP 回环 17.2 µs
单向吞吐(64 KiB 块,1 GiB):Unix 域套接字 1.76 GB/s,TCP 回环 3.94 GB/s吞吐与延迟是 macOS 上的单次微基准,不能推广到 Linux。