smux_rust 0.2.1

A simple multiplexing library for Rust, inspired by xtaci/smux
//! 自定义配置示例(异步版本)
//!
//! 这个示例展示了如何使用自定义配置创建会话

use smux_rust::{client, server, Config};
use tokio::net::{TcpListener, TcpStream};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建自定义配置
    let config = Config {
        version: 2, // 使用协议版本 2
        keep_alive_disabled: false,
        keep_alive_interval: Duration::from_secs(5),  // 5 秒保活间隔
        keep_alive_timeout: Duration::from_secs(15),  // 15 秒超时
        max_frame_size: 16384,      // 16KB 最大帧
        max_receive_buffer: 2_097_152,  // 2MB 接收缓冲区
        max_stream_buffer: 32768,   // 32KB 流缓冲区
    };

    // 验证配置
    config.verify()?;
    println!("配置验证通过");

    // 启动服务器
    let server_config = config.clone();
    let server_handle = tokio::spawn(async move {
        custom_config_server(server_config).await.unwrap();
    });

    tokio::time::sleep(tokio::time::Duration::from_millis(1)).await;

    // 运行客户端(使用相同配置)
    custom_config_client(config).await?;

    server_handle.await.unwrap();
    Ok(())
}

async fn custom_config_server(config: Config) -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:8082").await?;
    println!("自定义配置服务器监听在 127.0.0.1:8082");
    println!("配置: 版本={}, 最大帧={}B, 接收缓冲区={}B", 
             config.version, config.max_frame_size, config.max_receive_buffer);

    loop {
        let (tcp_conn, _) = listener.accept().await?;
        let session = server(Box::new(tcp_conn), Some(config.clone())).await?;

        if let Ok(mut stream) = session.accept_stream().await {
            let mut buf = [0u8; 1024];
            if let Ok(n) = stream.read(&mut buf).await {
                println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
                stream.write_all(b"Response with custom config").await?;
            }
            stream.close().await?;
        }

        session.close().await?;
    }
}

async fn custom_config_client(config: Config) -> Result<(), Box<dyn std::error::Error>> {
    let tcp_conn = TcpStream::connect("127.0.0.1:8082").await?;
    let session = client(Box::new(tcp_conn), Some(config)).await?;

    let mut stream = session.open_stream().await?;
    stream.write_all(b"Hello with custom config").await?;

    let mut buf = [0u8; 1024];
    if let Ok(n) = stream.read(&mut buf).await {
        println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
    }

    stream.close().await?;
    session.close().await?;
    Ok(())
}