client_with_callback/
client_with_callback.rs1use rperf3::{Client, Config, ProgressCallback, ProgressEvent, Protocol};
2use std::time::Duration;
3
4struct 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 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)); let client = Client::new(config)?.with_callback(MyProgressCallback);
64
65 println!("Connecting to server at 127.0.0.1:5201...\n");
66
67 client.run().await?;
69
70 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}