client_with_callback/
client_with_callback.rs

1use rperf3::{Client, Config, ProgressCallback, ProgressEvent, Protocol};
2use std::time::Duration;
3
4/// Custom callback that logs progress events
5struct MyProgressCallback;
6
7impl ProgressCallback for MyProgressCallback {
8    fn on_progress(&self, event: ProgressEvent) {
9        match event {
10            ProgressEvent::TestStarted => {
11                println!("šŸš€ Test has started!");
12            }
13            ProgressEvent::IntervalUpdate {
14                interval_start,
15                interval_end,
16                bytes,
17                bits_per_second,
18                ..
19            } => {
20                println!(
21                    "šŸ“Š [{:.1}-{:.1}s] {} bytes transferred @ {:.2} Mbps",
22                    interval_start.as_secs_f64(),
23                    interval_end.as_secs_f64(),
24                    bytes,
25                    bits_per_second / 1_000_000.0
26                );
27            }
28            ProgressEvent::TestCompleted {
29                total_bytes,
30                duration,
31                bits_per_second,
32                ..
33            } => {
34                println!(
35                    "āœ… Test completed! {} bytes in {:.2}s @ {:.2} Mbps",
36                    total_bytes,
37                    duration.as_secs_f64(),
38                    bits_per_second / 1_000_000.0
39                );
40            }
41            ProgressEvent::Error(msg) => {
42                eprintln!("āŒ Error: {}", msg);
43            }
44        }
45    }
46}
47
48#[tokio::main]
49async fn main() -> Result<(), Box<dyn std::error::Error>> {
50    env_logger::init();
51
52    println!("rperf3 Client with Callback Example");
53    println!("====================================\n");
54
55    // Configure the test
56    let config = Config::client("127.0.0.1".to_string(), 5201)
57        .with_protocol(Protocol::Tcp)
58        .with_duration(Duration::from_secs(10))
59        .with_buffer_size(128 * 1024)
60        .with_interval(Duration::from_secs(2)); // Report every 2 seconds
61
62    // Create client with custom callback
63    let client = Client::new(config)?.with_callback(MyProgressCallback);
64
65    println!("Connecting to server at 127.0.0.1:5201...\n");
66
67    // Run the test (callback will be invoked during execution)
68    client.run().await?;
69
70    // Get final measurements
71    let measurements = client.get_measurements();
72    println!("\nšŸ“ˆ Final Statistics:");
73    println!("   Total bytes: {}", measurements.total_bytes_sent);
74    println!(
75        "   Duration: {:.2}s",
76        measurements.total_duration.as_secs_f64()
77    );
78    println!(
79        "   Average bandwidth: {:.2} Mbps",
80        measurements.total_bits_per_second() / 1_000_000.0
81    );
82
83    Ok(())
84}