use simulacra::{Duration, NetEvent, Network, NodeId, TopologyBuilder};
const LAN_LATENCY: Duration = Duration::from_millis(1);
const WAN_LATENCY: Duration = Duration::from_millis(20);
const LAN_BW_BPS: u64 = 100_000_000 / 8; const WAN_BW_BPS: u64 = 10_000_000 / 8; const MESSAGE_SIZE: u64 = 1_000_000;
fn main() {
let topology = TopologyBuilder::new(5)
.link_with_capacity(0u32, 1u32, LAN_LATENCY, LAN_BW_BPS) .link_with_capacity(4u32, 1u32, LAN_LATENCY, LAN_BW_BPS) .link_with_capacity(1u32, 2u32, WAN_LATENCY, WAN_BW_BPS) .link_with_capacity(2u32, 3u32, LAN_LATENCY, LAN_BW_BPS) .build();
let mut net: Network<&'static str> = Network::new(topology, 42);
println!("Two clients each send a 1 MB message to the server over a shared 10 Mbps WAN.\n");
net.send_sized(NodeId(0), NodeId(3), "client_a payload", MESSAGE_SIZE);
net.send_sized(NodeId(4), NodeId(3), "client_b payload", MESSAGE_SIZE);
let stats = net.run(|ctx, event| {
if let NetEvent::Deliver(msg) = event {
println!(
"[{:>12}] {:?} arrived at server (from {:?})",
ctx.now(),
msg.payload,
msg.src
);
}
});
println!(
"\nFinal simulated time = {} (both messages delivered)",
stats.final_time
);
println!(
"If the WAN were uncapped, both would arrive around {} (LAN + WAN latency only).",
LAN_LATENCY + WAN_LATENCY + LAN_LATENCY
);
}