プログラミング

RustでUDP通信を使おう!


Warning: count(): Parameter must be an array or an object that implements Countable in /home/c9962019/public_html/mochinoki-labo.com/wp-content/plugins/rich-table-of-content/functions.php on line 490

こんにちは、MSKです。
今回はRustでUDP通信を行ってみたいと思います。

関連記事

PythonでUDP通信をやってみよう!今回はUDP通信をPythonで行いたいと思います。 UDP通信の概要を解説して、実際にコードを書いて動作をみたいと思います。...

以前、PythonでUDPを通信をやってみました。
今回はRustでUDP通信を試してみます。

今回も簡単なプログラムを作成します。
受信側は受け取った文字列を表示するだけのプログラムで、送信側は入力された文字列をブロードキャストするようなプログラムです。

受信側プログラム

次のような処理を行っています。

  1. アドレスとポートを指定して、ソケットを開きます。
  2. メッセージの受信を待ちます。
  3. 受信したメッセージを表示します。
use std::net::{UdpSocket};

const RECV_ADDR: &str = "127.0.0.1:8080";

fn main() {
    {
        match UdpSocket::bind(RECV_ADDR) {
            Ok(sock) => {
                loop {
                    let mut buff = [0;200];
                    match sock.recv_from(&mut buff) {
                        Ok((recv_size, src)) => {
                            println!("receive from {}",src);
                            match String::from_utf8(buff[..recv_size].to_vec()) {
                                Ok(v) => println!("receive message : {}",v),
                                Err(v) =>println!("failed to convert to string from u8 array:{}",v),
                            }
                        },
                        Err(_) => println!("failed to receive message"),
                    }
                }
                println!("stop receiver");
            },
            Err(v) => {
                println!("failed to start udp receiver:{}",v);
            }
        }
    }
}

送信側プログラム

次に送信側のプログラムです。
次のような処理を行っています。

  1. アドレスとポートを指定してソケットを開きます。
  2. メッセージを標準入力から取得します。
  3. 送信先のアドレスとポートを指定してメッセージを送信します。
use std::net::{UdpSocket};
use std::{io};

const SENDER_ADDR:&str = "127.0.0.1:8081";
const BROADCAST_ADDR: &str = "255.255.255.255:8080";

fn main() {
    {
        match UdpSocket::bind(SENDER_ADDR) {
            Ok(sock) => {
                sock.set_broadcast(true).expect("failed to set broadcast");
                loop {
                    let mut input = String::new();
                    io::stdin().read_line(&mut input).expect("failed to get input");
                    match sock.send_to(input.as_bytes(), BROADCAST_ADDR) {
                        Ok(v) => println!("send message : {}", &input[..v]),
                        Err(v) => println!("failed to send message:{}",v),
                    }
                }
                println!("stop sender");
            },
            Err(v) => println!("failed to start sender:{}",v),
        }
    }
}


受信側を立ち上げて、送信側にメッセージを打つと受信側に送信側から送ったメッセージが表示されると思います。

最後に

TCP通信と同じであまり難しくなく、データ通信できました。
Rustではstd::netのUdpSocketを使って、ソケットを開き、このソケットに対して送受信を行うとデータ通信ができます。

最後までご覧いただき、ありがとうございます。
「RustでUDP通信を使おう!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。