首页 文章

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

提问于
浏览
3

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

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.

1 回答

  • 4

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

    第一行被发送,由服务器读取,回显,然后服务器关闭连接 . Netcat获得第二行,将其写入套接字,并获取“Broken pipe”,因为服务器已关闭连接 .

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

相关问题