Rustで簡単なネットワークプログラムをつくる

Rustで簡単なネットワークプログラムをつくる

少し前にRustに関する記事を書いたと思います。
どうしても気になってしまいまして、何かしたいと思いました。
そこで今回はRustで簡単なサーバプログラムとクライアントプログラムを作ってみたいと思います。
前にも書きましたがRustは新しい概念が多いと思います。
ですからただ覚えるのではなく、何かを作りながらではないと身に付けるのが難しいと思いました。


サーバーの方

まずサーバーのほうから始めていきたいと思います。
どうせc言語とかpythonとかと同じだろうと思ったら全然違ってました。
これは多分すぐ忘れる

まずコマンド引数のとり方からちょっと馴染みがないです。
bind自体は一行ですむのですが、IPアドレスとポート番号をコロンで繋いで文字列として関数に渡しております。


listener.incomingというのはc言語でいうacceptのことでしょうか。
接続が来たらそれをmatchに渡して正当性の確認をしています。


問題ないようであれば、スレッドを生成してその中で関数を呼び出しています。
実際のデータのやり取りはsendRecv関数がやってます。


データ格納用の変数を定義してます。
let mut buf = [0; 512];
これはc言語で言うところの
char buf[512];
なんでしょうか。


そしてstream.readで相手からデータを受信してます。
受信バイトを確認しつつそのまま受信したものを送信してます。


streamに関してところどころ ? が付いている箇所があるかと思います。
これがどうやらエラーハンドリングをしてくれているようです。
もしエラーがあれば呼び出し元に帰りunwrap_or_elseが実行されるのかと。


ソケットやデータの送受信部分については特に問題ないですね

クライアントの方

クライアントの方もコマンド引数をとりそれをコロンでつないで関数に渡してます。
TcpStream::connect(coninfo)がそうです。


そしてあとはループの中で標準入力から文字列をもらいそれをバイト型に変換してストリームに渡してます。
ここがサーバーと違うところなのですが、なぜかstream.readができませんでした。
TcpStreamの場合、BufReaderをつかってデータを受信するようです。


BufReader::new(&stream);がそれの前処理的なもので、
reader.read_until(b’\n’,&mut buffer)が実際に読み込む処理なのでしょうか。


今回は単なるエコーサーバーなので送った文字列が返ってきます。
サーバー側もですがc言語よりかは圧倒的に記述量は少ないと思います。

これから

今回は簡単なサーバープログラムとクライアントプログラムを作りました。
これからどうしましょう。
今まで他の言語作ったものをすべてRustで書き直すみたいなことすれば身につきますかね。
Rustで何かを作ってる方は何かおすすめを教えていただければと思います。


他にもRustについて記事があります。

コメントする