You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 在Cargo.toml中添加依赖:
[dependencies]
tokio = { version = "1.0", features = ["full"] }
socket2 = "0.5"
  1. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:35:36