changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate rust/lib/sxp/examples/udp.rs

changeset 698: 96958d3eb5b0
parent: 3d78bed56188
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
8
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
1
 //! udp client example
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
3
 //! to use this example - start one instance, then in a separate
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
4
 //! terminal start another which connects to the first:
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
5
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
6
 //! > cargo run  --example udp 9980
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
7
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
8
 //! > cargo run --example udp 9981 9980
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
9
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
10
 //! PS - you can change the formatter by specifying one on the command
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
11
 //! line. It affects both read and write streams.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
13
 //! > cargo run --example udp 9980 binary
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
14
 use serde_derive::{Deserialize, Serialize};
67
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
15
 use std::{
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
16
   net::{SocketAddr, UdpSocket},
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
17
   time::Duration,
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
18
 };
8
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
19
 #[derive(Serialize, Deserialize)]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
20
 struct Packet {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
21
   id: usize,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
22
   key: String,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
23
   payload: Vec<f64>,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
24
 }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
25
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
26
 impl Packet {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
27
   fn new() -> Self {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
28
     Packet {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
29
       id: 0,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
30
       key: String::new(),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
31
       payload: vec![],
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
32
     }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
33
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
34
   fn next(&mut self) -> Vec<u8> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
35
     self.id += 1;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
36
     self.payload = rand::random::<[f64; 32]>().to_vec();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
37
     sxp::to_vec(&self).unwrap()
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
38
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
39
 }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
40
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
41
 fn main() {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
42
   let mut args = std::env::args().skip(1);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
43
   let addr = SocketAddr::new(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
44
     "127.0.0.1".parse().unwrap(),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
45
     args.next().unwrap().parse::<u16>().unwrap(),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
46
   );
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
47
   let socket = UdpSocket::bind(addr).expect("failed to bind socket");
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
48
   socket
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
49
     .set_read_timeout(Some(Duration::from_millis(500)))
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
50
     .unwrap();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
51
   let mut peer = None;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
52
   let mut rx = [0u8; 1024];
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
53
   let mut tx = Packet::new();
189
3d78bed56188 apply clippy fixes
Richard Westhaver <ellis@rwest.io>
parents: 67
diff changeset
54
   for x in args {
8
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
55
     if let Ok(x) = x.parse::<u16>() {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
56
       peer = Some(SocketAddr::new("127.0.0.1".parse().unwrap(), x));
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
57
       socket.connect(peer.unwrap()).unwrap();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
58
     } else {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
59
       match x.as_str() {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
60
         "default" => (),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
61
         "binary" => (),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
62
         "pretty" => (),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
63
         _ => eprintln!("invalid formatter"),
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
64
       }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
65
     }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
66
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
67
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
68
   loop {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
69
     if let Ok(_) = socket.recv(&mut rx) {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
70
       println!("{}", String::from_utf8_lossy(&rx).trim_end_matches('\0'));
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
71
       rx = rx.map(|_| 0);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
72
     } else if let Some(p) = peer {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
73
       std::thread::sleep(Duration::from_millis(500));
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
74
       tx.key = String::from_utf8_lossy(rand::random::<[u8; 32]>().as_slice())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
75
         .to_string();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
76
       // send a struct
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
77
       let bytes = socket.send(&mut tx.next()).unwrap();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
78
       println!("(:sent {bytes} :to {p})");
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
79
     }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
80
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
81
 }