Skip to main content

splice_bidirectional

Function splice_bidirectional 

Source
pub fn splice_bidirectional(
    client_fd: i32,
    upstream_fd: i32,
    pipe_buf_size: usize,
) -> Result<(usize, usize)>
Expand description

TCP 双向中继:使用 splice(2) 实现内核态零拷贝双向转发。

创建两条管道,分别中继 client → upstreamupstream → client。 全程数据不进入用户态缓冲区,达到内核零拷贝极限性能。

采用双线程模型(每方向一线程),避免单线程中一个方向阻塞导致另一方向饥饿。 任一方向 EOF 即关闭对端 socket(shutdown(SHUT_WR)),触发另一方向也快速退出。

§参数

  • client_fd - 客户端 socket fd
  • upstream_fd - 上游 socket fd
  • pipe_buf_size - 管道缓冲区大小(建议 65536)

§返回

(c2u_bytes, u2c_bytes):分方向字节数 (c2u = client→upstream,u2c = upstream→client),便于调用方分账 rx/tx

§错误

  • LinuxError::Syscall { "pipe2", .. } - 管道创建失败
  • LinuxError::Syscall { "splice", .. } - splice 失败(含对端关闭 EPIPE/ECONNRESET)