pub fn splice_bidirectional(
client_fd: i32,
upstream_fd: i32,
pipe_buf_size: usize,
) -> Result<(usize, usize)>Expand description
TCP 双向中继:使用 splice(2) 实现内核态零拷贝双向转发。
创建两条管道,分别中继 client → upstream 和 upstream → client。
全程数据不进入用户态缓冲区,达到内核零拷贝极限性能。
采用双线程模型(每方向一线程),避免单线程中一个方向阻塞导致另一方向饥饿。 任一方向 EOF 即关闭对端 socket(shutdown(SHUT_WR)),触发另一方向也快速退出。
§参数
client_fd- 客户端 socket fdupstream_fd- 上游 socket fdpipe_buf_size- 管道缓冲区大小(建议 65536)
§返回
(c2u_bytes, u2c_bytes):分方向字节数
(c2u = client→upstream,u2c = upstream→client),便于调用方分账 rx/tx
§错误
LinuxError::Syscall { "pipe2", .. }- 管道创建失败LinuxError::Syscall { "splice", .. }- splice 失败(含对端关闭 EPIPE/ECONNRESET)