Function connect

Source
pub fn connect<T0, T1>(plug_0: T0, plug_1: T1)
where T0: IpSinkStream, T1: IpSinkStream,
Expand description

Convenience method for connecting two IpSinkStreams 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}