pub fn connect<T0, T1>(plug_0: T0, plug_1: T1)where
T0: IpSinkStream,
T1: IpSinkStream,
Expand description
Convenience method for connecting two IpSinkStream
s to each other.
Packets from either IpSinkStream
are forwarded to the other. See IpHub
if
you want to connect more than two interfaces.
Examples found in repository?
examples/ping_pong.rs (line 51)
16async fn main() {
17
18 // First create two machines.
19 let machine_0 = Machine::new().unwrap();
20 let machine_1 = Machine::new().unwrap();
21
22
23 // Then give each machine a network interface.
24 let ipv4_addr_0 = ipv4!("10.1.2.3");
25 let port_0 = 45666;
26 let addr_0 = SocketAddr::from((ipv4_addr_0, port_0));
27
28 let ipv4_addr_1 = ipv4!("192.168.5.5");
29 let port_1 = 5555;
30 let addr_1 = SocketAddr::from((ipv4_addr_1, port_1));
31
32 let iface_0 = {
33 machine_0
34 .add_ip_iface()
35 .ipv4_addr(ipv4_addr_0)
36 .ipv4_default_route()
37 .build()
38 .unwrap()
39 };
40 let iface_1 = {
41 machine_1
42 .add_ip_iface()
43 .ipv4_addr(ipv4_addr_1)
44 .ipv4_default_route()
45 .build()
46 .unwrap()
47 };
48
49
50 // Connect the network interfaces directly to each other.
51 netsim::connect(iface_0, iface_1);
52
53
54 // Execute a task on machine 0. This task waits to receive a UDP packet then sends a reply.
55 let join_handle_0 = machine_0.spawn(async move {
56 let socket = UdpSocket::bind(addr_0).await.unwrap();
57
58 let mut recv_bytes = [0u8; 100];
59 let (recv_len, peer_addr) = socket.recv_from(&mut recv_bytes).await.unwrap();
60 assert_eq!(peer_addr, addr_1);
61 let recv_msg = str::from_utf8(&recv_bytes[..recv_len]).unwrap();
62 println!("received msg: '{recv_msg}'");
63
64 let send_msg = "pong";
65 let send_len = socket.send_to(send_msg.as_bytes(), addr_1).await.unwrap();
66 assert_eq!(send_len, send_msg.len());
67 println!("sent reply: '{send_msg}'");
68 });
69 // Execute a task on machine 1. This task sends UDP packets until it receives a reply.
70 let join_handle_1 = machine_1.spawn(async move {
71 let socket = UdpSocket::bind(addr_1).await.unwrap();
72 let mut recv_bytes = [0u8; 100];
73
74 let (recv_len, peer_addr) = loop {
75 let send_msg = "ping";
76 let send_len = socket.send_to(send_msg.as_bytes(), addr_0).await.unwrap();
77 assert_eq!(send_len, send_msg.len());
78 println!("sent msg: '{send_msg}'");
79
80 tokio::select! {
81 recv_result = socket.recv_from(&mut recv_bytes) => break recv_result.unwrap(),
82 () = tokio::time::sleep(Duration::from_secs(1)) => (),
83 }
84 };
85 assert_eq!(peer_addr, addr_0);
86 let recv_msg = str::from_utf8(&recv_bytes[..recv_len]).unwrap();
87 println!("received reply: '{recv_msg}'");
88 });
89
90
91 // Wait for both machines to run their tasks to completion.
92 let () = join_handle_0.await.unwrap().unwrap();
93 let () = join_handle_1.await.unwrap().unwrap();
94}