Rustの練習の一貫としてTCP EchoサーバーをRustで実装した。TCP Echoサーバー とはTCPソケットを開いて接続を待ち受け、送られてきたデータをそのまま返 すサーバーである。今回はそれを作成し、接続確認を行った。

TCP Echoサーバーを書く

TCP Echoサーバーを実装していく。ファイルecho_server.rsを作成する。エン トリーポイントとなるmain()と、サーバーのための関数としてecho_main()を 定義する。

use std::io;
use std::net::TcpListener;
use std::thread::spawn;

fn echo_main(addr: &str) -> io::Result<()> {
    let listener = TcpListener::bind(addr)?;
    println!("Listening on {}", addr);
    loop {
        let (mut stream, _addr) = listener.accept()?;
        println!("Connection receive");

        let mut write_stream = stream.try_clone()?;
        spawn(move || {
            io::copy(&mut stream, &mut write_stream).expect("An error occured in client.");
            println!("connection closed.");
        });
    }
}

fn main() {
    echo_main("127.0.0.1:17007").expect("An error occured.");
}
echo_server.rs

ビルドする

シンプルな構成なのでrustcで直接コンパイルする。

$ rustc echo_server.rs

ビルドが終わるとecho_serverというバイナリファイルが作成されている。

実行する

ビルドで生成したecho_serverを実行する。

$ ./echo_server
Listening on 127.0.0.1:17007

起動するとecho_serverは17007ポートにTCPのソケットを開いて待ち受ける。

接続の確認を行う

TCPで接続できれば確認ができる。 使うツールは何でも良い。例えばtelnetやcurlでも確認ができるだろう。 スクリプトで簡易なプログラムを書いても良い。

今回はEmacsのnetwork-connectionを使用した。Emacsで M-xnetwork-connection RET を実行すると接続先のホストとポートの入力をminiバッファー上で求めてくる。

ホストには 127.0.0.1 、ポートには 17007 をそれぞれ指定する。

ホスト127.0.0.1
ポート17007
network-connectionで指定する値

接続できるとバッファが開く。そこで文字を入力し C-c C-c する。 すると入力した文字は送られ、同じ文字がかえってくる。

echo_serverの標準出力には接続と切断のログが出力される。

Listening on 127.0.0.1:17007
Connection receive
connection closed.
Connection receive
echo_serverの標準出力に出力された接続と切断のログ

参考

  • プログラミングRust (オライリー・ジャパン)