🦀

Rustで書くUDPサーバー

2021/06/21に公開

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