TCP流中何时出现损坏的管道?

时间:2017-08-14 05:52:08

标签: tcp rust netcat

我正在尝试在Rust中编写一个echo服务器。

    set aTable as selection.tables(1)

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

1 个答案:

答案 0 :(得分:6)

A'断管'当您写入另一端已关闭的流时,会出现消息。在您的示例中,您的handle_connection例程从客户端读取单个缓冲区,将其复制回客户端,然后返回,这将关闭流。当您从终端运行netcat时,终端默​​认为行缓冲,因此您键入的每一行都将作为单次写入发送到服务器。

发送第一行,由服务器读取,回送,然后服务器关闭连接。 Netcat获得了第二行,将其写入套接字,并获得了一个“破坏的管道”。因为服务器已关闭连接。

如果您希望服务器读取多条消息,则需要进行handle_connection例程循环,从流中读取,直到获得EOF。