LoginSignup
42
38

More than 1 year has passed since last update.

Rustで書くUDPサーバー

Posted at

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サイズと送信元アドレスと一緒に表示されている。

42
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
38