Tokio 1.0移除set_keepalive后,如何设置TCP keepalive?
在Tokio 1.0中设置TCP Keepalive的方法
Tokio 1.0对TCP相关API做了调整,原0.1版本的set_keepalive方法被整合到tokio::net::TcpStream中,同时支持基础配置和更精细的高级配置,具体方式如下:
基础配置:直接使用Tokio的API
tokio::net::TcpStream提供了set_keepalive方法,用法和0.1版本类似,参数为Option<Duration>,传入Some(Duration)开启keepalive,None关闭。
示例代码:
use tokio::net::TcpStream; use std::time::Duration; use std::io; async fn setup_basic_keepalive() -> io::Result<()> { let mut stream = TcpStream::connect("127.0.0.1:8080").await?; // 开启keepalive,设置空闲30秒后开始探测 stream.set_keepalive(Some(Duration::from_secs(30)))?; Ok(()) }
高级配置:使用socket2库自定义参数
如果需要配置keepalive的探测间隔、重试次数等更精细的参数,需要借助socket2库操作底层socket:
- 在
Cargo.toml中添加依赖:
[dependencies] tokio = { version = "1.0", features = ["full"] } socket2 = "0.5"
- 示例代码:
use tokio::net::TcpStream; use std::time::Duration; use std::io; use socket2::{TcpKeepalive, Socket}; async fn setup_advanced_keepalive() -> io::Result<()> { let stream = TcpStream::connect("127.0.0.1:8080").await?; // 将Tokio流转换为socket2的Socket let mut socket = Socket::from(stream.into_std()?); // 配置完整的keepalive参数 let keepalive_config = TcpKeepalive::new() .with_time(Duration::from_secs(30)) // 空闲30秒后发起首次探测 .with_interval(Duration::from_secs(5)) // 每次探测间隔5秒 .with_retries(5); // 重试5次后判定连接断开 socket.set_tcp_keepalive(&keepalive_config)?; // 转换回Tokio的TcpStream继续使用 let _stream = TcpStream::from_std(socket.into())?; Ok(()) }
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

