Rustで始めるUDP通信#
はじめに#
UDP通信の細かい話については前節で説明したため省略させていただきます。
詳しくは以下をご覧ください。
ライブラリを持ってくる#
C言語だとincludeの部分ですね
use std::net::UdpSocket;
通信の初期化#
fn main()
{
let sock = UdpSocket::bind("192.168.4.2:8080").unwrap();
}
UdpSocketという構造体をuseで持ってきたので、UdpSocketにインプリントされたbind関数を用いて通信の初期化を行っている。 文字列でIPアドレス:ポートというように記述する。今回はIPアドレスは192.168.4.2でポートは8080にした(テキトー)
メッセージの送信〜match文を添えて〜#
loop
{
let msg = "Hello, Rust UDP";
match sock.send_to(msg.as_bytes(), "192.168.4.1:10000") {
Ok(size)=>{
print!("Send size is {}\n", size);
}
Err(err)=>{
print!("{:?}\n", err);
}
}
}
ここではmatch文が全く違う使い方をされている。 matchで比較する文をResult型にした場合、成功したとき(つまりOk)と失敗した場合(つまりErr)で書き分けることができるのだ。
そしてUdpSocket構造体内にあるsend_to関数を使っている。これはその名の通り、2つ目の引数の相手に1つ目の引数の情報を送信するというものだ。 2つ目の引数については最初と同じように相手のアドレスとポートを指定しただけである。しかし、1つ目の引数については最初にstr(文字列)として宣言されたmsgをbyte列(要は送りやすい小さいデータ)に変換して送っているんですね。
そんなsend_to関数の返り値はResult<usize, Error>なので成功した場合の変数をOk()のなかに書くと送信に成功した文字列のサイズが入る。失敗した場合の方の変数にはエラー文が入る。
メッセージの受信#
let mut buf = [0_u8;256];
match sock.recv(&mut buf)
{
Ok(size)=>{
let get_msg = &buf[0..size];
let get_msg_str = String::from_utf8_lossy(get_msg).to_string();
print!("{}\n", get_msg_str);
}
Err(err)=>{
print!("{}\n", err);
}
}
先程と同じようなmatchによる条件分岐です。 詳しい受信についての説明は2.マイコンでUDP通信を始めるのメッセージを受信するというところをご覧ください。
Okだった場合に受信に成功したサイズを返すので、バッファのうちの受信に成功したサイズのみをget_msgという変数に突っ込んでいます。 その後、String(文字列)ライブラリに含まれるfrom_utf8_lossyという関数をもちいて、u8のバイト列から文字列に変換しています。というのも、受信する直前にbufという変数をu8(整数型8bit)の配列、サイズは256で宣言しているので、u8のバイト列からの変換を試みているわけです。from_utf8_lossyのあとにはちゃんと文字列にするためのto_stringをわすれずにしてください。
おわりに#
これで両者の情報交換については申し分ないでしょう。この先はその他で必要なことについてです。