web-dev-qa-db-ja.com

例TCP server written in Rust

RustのTCPサーバーの例を探しています。

「hello world」またはエコーサーバーのいずれかが最適です。

37
fadedbee

以下は_std::net_を使用した非常に簡単な例です。 Rustの現在のマスターに対して開発され、1。*でも動作するはずです。

この例には注意してください。簡素化されています。バインド、リッスン、または受け入れがエラーを生成した場合にパニックに陥らないようにすることができます。

_use std::io::Write;
use std::net::TcpListener;
use std::thread;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:9123").unwrap();
    println!("listening started, ready to accept");
    for stream in listener.incoming() {
        thread::spawn(|| {
            let mut stream = stream.unwrap();
            stream.write(b"Hello World\r\n").unwrap();
        });
    }
}
_

受け入れに関するパラダイムに注意してください。 accept()リクエストを自分で開始する必要があります(この例では、毎回incoming()を呼び出すaccept()イテレータを使用しています)。 real存在するタスクの制御。

その結果、実際のストリーム処理コードを別のスレッドに入れましたが、非常に短いリクエスト用である必要はありません(最初のリクエストの処理中に2番目のリクエストを処理できないことを意味します)。これら2行についてthread::spawn(|| { ... })を削除することもできます。追加のスレッドを使用すると、ある程度の分離も得られます。スレッドが巻き戻されると、サーバー全体が死ぬことはありません(ただし、メモリが不足したり、巻き戻し中にデストラクタパニックが発生するとサーバー全体が死ぬことに注意してください)。

45
Chris Morgan

シンプルTCP echo-server https://Gist.github.com/seriyps/fd6d29442e16c44ba4

#![feature(phase)]
#[phase(plugin, link)] extern crate log;
extern crate green;
extern crate rustuv;

use std::io;
use std::os;
use std::io::{Listener,Acceptor,TcpStream};

// This is for green threads. If removed, will spawn 1 OS thread per client.
#[start]
fn start(argc: int, argv: *const *const u8) -> int {
    green::start(argc, argv, rustuv::event_loop, main)
}


fn main() {
    let Host = "127.0.0.1";
    let port = 8080;

    let sock = io::TcpListener::bind(Host, port).unwrap();
    let mut acceptor = sock.listen();
    for stream in acceptor.incoming() {
        match stream {
            Err(e) => warn!("Accept err {}", e),
            Ok(stream) => {
                spawn(proc() {
                    debug!("{}", handle_client(stream));
                })
            }
        }
    }
}

fn handle_client(mut stream: io::TcpStream) -> io::IoResult<()> {
    info!("New client {}", stream.peer_name());
    let mut buf = [0u8, ..4096];
    loop {
        let got = try!(stream.read(buf));
        if got == 0 {
            // Is it possible? Or IoError will be raised anyway?
            break
        }
        try!(stream.write(buf.slice(0, got)));
    }
    Ok(())
}
5
seriyPS