2017-08-14 9 views
3

私はRustにエコーサーバを書き込もうとしています。破損したパイプはいつTCPストリームで発生しますか?

use std::net::{TcpStream, TcpListener}; 
use std::io::prelude::*; 

fn main() { 
    let listener = TcpListener::bind("0.0.0.0:8000").unwrap(); 
    for stream in listener.incoming() { 
     let stream = stream.unwrap(); 
     println!("A connection established"); 
     handle_connection(stream); 
    } 

} 

fn handle_connection(mut stream: TcpStream) { 
    let mut buffer = [0; 512]; 

    stream.read(&mut buffer).unwrap(); 

    println!("Request: {}", String::from_utf8_lossy(&buffer[..])); 
    stream.write(&buffer[..]).unwrap(); 
    stream.flush().unwrap(); 
} 

予想通りnc localhost 8000と最初の要求が作動しているが、後続の要求ではありません。私は間違って何をしていますか?サーバーがクライアントからの要求をどのように読み取っているかに問題がありますか?エラーサーバー側はありませんが。

私は、端末上でそれらを入力してデータを送信しています:あなたはもう一方の端が閉じられたストリームに書き込むとき

$ nc localhost 8000 
hi 
hi 
hello 
# no response 
# on pressing enter 
Ncat: Broken pipe. 
+0

"その後のリクエストはありません。" 'nc'経由でデータをどのように送っていますか?正確なエラーは何ですか?あなたはコードが私のために働くようです。 – loganfsmyth

+0

@loganfsmyth 端末に入力してデータを送信しています。質問 – codeNoob

答えて

4

「壊れたパイプ」というメッセージが発生しました。あなたの例では、handle_connectionルーチンは、クライアントから単一のバッファを読み込み、それをクライアントにコピーしてから返し、ストリームを閉じます。このような端末からnetcatを実行すると、端末はデフォルトでラインバッファリングを行うので、入力した各行は1回の書き込みとしてサーバに送信されます。

最初の行が送信され、サーバーによって読み取られ、エコーバックされた後、サーバーは接続を閉じます。 Netcatは2行目を取得し、それをソケットに書き込み、サーバが接続を終了したため 'Broken pipe'を取得します。

サーバーに複数のメッセージを読み込ませる場合は、handle_connectionルーチンをループさせて、ストリームからEOFを取得するまで読む必要があります。

+0

を更新しました。それが私の問題を解決しました。 – codeNoob

関連する問題