Interface編集部
Gowin Vol.3 第2部第4章 リスト6
use std::{io::Read, net::UdpSocket, time::Duration};
use clap::Parser;
#[derive(Parser, Debug)]
struct Cli {
#[arg(long, default_value = "192.168.10.1:10002")]
bind_to: String, // --bind-to でUDPの受信側インターフェースを指定する
#[arg(long, default_value = "192.168.10.2:10002")]
destination: String, // --destination
}
fn main() -> anyhow::Result<()> {
env_logger::init();
let args: Cli = Cli::parse();
let socket = UdpSocket::bind(&args.bind_to)?;
socket.set_read_timeout(Some(Duration::from_millis(10)))?; // 受信タイムアウト:10ms
let (sender, receiver) = std::sync::mpsc::channel();
std::thread::spawn(move || loop { // 標準入力から読み出してキューに入れるスレッド
let mut buf = vec![0; 1024];
let bytes_read = std::io::stdin().read(&mut buf).unwrap();
buf.truncate(bytes_read);
sender.send(buf).unwrap();
});
loop {
let packet = receiver.recv().unwrap(); // 標準入力から読み出したデータをキューから取り出す
if let Err(error) = socket.send_to(&packet, &args.destination) { // 取り出したデータを送信する
log::error!("pattern send error: {}", error);
}
let mut buf = [0u8; 5];
if let Ok((size, from)) = socket.recv_from(&mut buf) { // バッファがしきい値を下回った通知受信待ち
if size == 5 { // 受信したデータ長が意図した長さ?
let remaining = u16::from_be_bytes([buf[1], buf[2]]); // 残バッファ内エントリ数
let maximum = u16::from_be_bytes([buf[3], buf[4]]); // 最大バッファ可能エントリ数
log::debug!("{}/{} from {}", remaining, maximum, from);
}
}
}
}