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.");
}
ビルドする
シンプルな構成なので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 |
接続できるとバッファが開く。そこで文字を入力し C-c C-c
する。
すると入力した文字は送られ、同じ文字がかえってくる。
echo_serverの標準出力には接続と切断のログが出力される。
Listening on 127.0.0.1:17007 Connection receive connection closed. Connection receive
参考
- プログラミングRust (オライリー・ジャパン)