との単純なRust HTTPサーバーベンチマーク言語の並行処理プリミティブとそのスレッドモデルで再生するために、非常に単純な同時サーバーをRustで作成しようとしています。私はプログラムを実行してab -c 100 -n 100 http://127.0.0.1:1337/
を実行すると、上記のよう「ピアによる接続リセット」ab
use std::io::prelude::*;
use std::io::Result;
use std::net::{TcpListener, TcpStream, Shutdown};
use std::sync::{Arc, Mutex};
use std::thread;
fn handle_client(mut stream: TcpStream) -> Result<()> {
try!(stream.write(b"HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\nPong!\r\n"));
// try!(stream.shutdown(Shutdown::Both));
Ok(())
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:1337").unwrap();
// let count = Arc::new(Mutex::new(0));
for stream in listener.incoming() {
match stream {
Ok(stream) => {
// let count = count.clone();
thread::spawn(move || {
let _ = handle_client(stream);
// let mut count = count.lock().unwrap();
// *count += 1;
// println!("{:?}", *count);
});
}
Err(e) => {
println!("Error: {}", e);
}
}
}
drop(listener);
}
が、私はほとんどすぐにapr_socket_recv: Connection reset by peer (104)
を得る:ここに私のコードです。どうして?
私はtry!(stream.shutdown(Shutdown::Both));
を追加する(上記、上部付近にコメントアウト)私はもう前のようにapr_socket_recv
エラーを取得していないが、apachebenchは私に199が原因の例外に要求を失敗したと言う結果が得られます。どうして?私は間違って何をしていますか?
Concurrency Level: 100
Time taken for tests: 0.008 seconds
Complete requests: 100
Failed requests: 199
(Connect: 0, Receive: 0, Length: 0, Exceptions: 199)
Total transferred: 500 bytes
、あなたのコンテンツの長さが5ではない、それは\ 7(あなたが最後逃したですr \ n)。しかし、これがエラーの理由であるとは考えにくいと思います... –
冗長モードで実行することができます(コマンドラインに '-v'フラグを追加してください)? 2/3のリクエストが失敗したのは不思議です...もしそれらのすべてが失敗したら私は理解していたでしょう... –
'' use std :: io :: Result'に対して、 'Result'タイプです。代わりに 'std :: io'と' io :: Result'を使うことをお勧めします。また、 'drop'を明示的に使う必要はほとんどありません。値は、定義されているスコープの最後に自動的にドロップされます。 – Shepmaster