🦀
Rustで書くUDPサーバー
UDP Listen
UdpSocket
を使ってlocalhostとbindする。
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:34254")?;
}
受信できるBufferの容量を指定。
今回は2048byte。
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:34254")?;
let mut buf = [0; 2048];
}
待ち受けしているポートが受信した場合の処理を書く。
また、一回の受信後はまた待ち受け状態にするために、処理をループさせる。
loop {
match socket.recv_from(&mut buf) {
Ok((buf_size, src_addr)) => {
//
},
Err(e) => {
println!("couldn't recieve request: {:?}", e);
}
}
}
受信した情報をconsole上にstdoutさせる。
今回出力させるのは、Bufferサイズ、送信元アドレス、メッセージ内容。
loop {
match socket.recv_from(&mut buf) {
Ok((buf_size, src_addr)) => {
thread::spawn(move || {
let buf = &mut buf[..buf_size];
let req_msg = str::from_utf8(&buf).unwrap();
println!("{:}", "=".repeat(80));
println!("buffer size: {:?}", buf_size);
println!("src address: {:?}", src_addr);
println!("request message: {:?}", req_msg);
});
},
Err(e) => {
println!("couldn't recieve request: {:?}", e);
}
}
}
全体のコード
全体のコードが以下になる。
use std::net::UdpSocket;
use std::thread;
use std::str;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:34254")?;
let mut buf = [0; 2048];
loop {
match socket.recv_from(&mut buf) {
Ok((buf_size, src_addr)) => {
thread::spawn(move || {
let buf = &mut buf[..buf_size];
let req_msg = str::from_utf8(&buf).unwrap();
println!("{:}", "=".repeat(80));
println!("buffer size: {:?}", buf_size);
println!("src address: {:?}", src_addr);
println!("request message: {:?}", req_msg);
});
},
Err(e) => {
println!("couldn't recieve request: {:?}", e);
}
}
}
}
実行
実際に動かして待ち受け状態にした後、nc
コマンドでメッセージを送信してみる。
結果が以下。
## Send
$ nc -u 127.0.0.1 34254
固め
濃いめ
多め
## Listen
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/rust-udp-server`
================================================================================
buffer size: 7
src address: 127.0.0.1:51038
request message: "固め\n"
================================================================================
buffer size: 10
src address: 127.0.0.1:51038
request message: "濃いめ\n"
================================================================================
buffer size: 7
src address: 127.0.0.1:51038
request message: "多め\n"
送信された文字列が、それぞれBufferサイズと送信元アドレスと一緒に表示されている。
Discussion