1use sapflow_srt::{Config, Event, Listener};
10use std::io::ErrorKind;
11use std::net::UdpSocket;
12use std::time::{Duration, Instant};
13
14fn main() -> std::io::Result<()> {
15 let socket = UdpSocket::bind("0.0.0.0:9000")?;
16 let mut listener = Listener::new(Config::default(), Instant::now());
17 let mut buf = [0u8; 2048];
19
20 loop {
21 let now = Instant::now();
23 let wait = listener
24 .poll_timeout()
25 .map_or(Duration::from_millis(100), |at| {
26 at.saturating_duration_since(now)
27 })
28 .max(Duration::from_millis(1));
29 socket.set_read_timeout(Some(wait))?;
30 match socket.recv_from(&mut buf) {
31 Ok((n, peer)) => {
32 if let Some(datagram) = buf.get(..n) {
33 listener.handle_datagram(Instant::now(), peer, datagram);
34 }
35 }
36 Err(e) if matches!(e.kind(), ErrorKind::WouldBlock | ErrorKind::TimedOut) => {}
37 Err(e) => return Err(e),
38 }
39 listener.handle_timeout(Instant::now());
40
41 while let Some(event) = listener.poll_event() {
42 match event {
43 Event::Connect {
44 id,
45 peer,
46 stream_id,
47 } => {
48 println!("{peer} wants {:?}", String::from_utf8_lossy(&stream_id));
51 listener.accept(id, Instant::now());
52 }
53 Event::Data { id, payload } => println!("{id:?}: {} bytes", payload.len()),
54 Event::Closed { id, reason, .. } => println!("{id:?} closed: {reason:?}"),
55 }
56 }
57 while let Some((to, datagram)) = listener.poll_transmit() {
58 socket.send_to(&datagram, to)?;
59 }
60 }
61}