use rperf3::{Client, Config, Protocol};
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
println!("UDP Socket Optimization Demo");
println!("============================\n");
println!("This demo tests UDP with:");
println!("- 2MB send/receive buffers");
println!("- Improved burst handling");
println!("- Expected 10-20% improvement with reduced packet loss\n");
println!("Note: Make sure the server is running first:");
println!(" cargo run --release -- -s -p 5201\n");
println!("Starting UDP test (5 seconds, 100 Mbps)...\n");
let client_config = Config::client("127.0.0.1".to_string(), 5201)
.with_protocol(Protocol::Udp)
.with_duration(Duration::from_secs(5))
.with_interval(Duration::from_secs(1))
.with_bandwidth(100_000_000);
let client = Client::new(client_config)?;
client.run().await?;
let measurements = client.get_measurements();
let total_bytes = measurements.total_bytes_sent + measurements.total_bytes_received;
let bits_per_second = measurements.total_bits_per_second();
let packet_loss = if measurements.total_packets > 0 {
(measurements.lost_packets as f64 / measurements.total_packets as f64) * 100.0
} else {
0.0
};
println!("\n=== Results ===");
println!(
"Total transferred: {:.2} MB",
total_bytes as f64 / 1_000_000.0
);
println!("Throughput: {:.2} Mbps", bits_per_second / 1_000_000.0);
println!("Packet loss: {:.2}%", packet_loss);
println!("\nSocket optimizations applied:");
println!("✓ Send buffer: 2MB");
println!("✓ Recv buffer: 2MB");
println!("✓ Reduced packet loss with larger buffers");
Ok(())
}