TCP流中何时发生断开连接?

12

我正在尝试使用Rust编写一个回声服务器。

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.

“但是后续的请求不行。”请具体说明您是如何通过nc发送数据的?您遇到了什么确切的错误?您的代码在我的电脑上似乎可以工作。 - loganfsmyth
我正在通过在终端上输入数据来发送它们。问题已更新。 - codeNoob
1个回答

17
“Broken pipe”错误消息是在尝试写入已关闭的流时发生的。在您的示例中,您的handle_connection例程从客户端读取单个缓冲区,将其复制回客户端,然后返回,这将关闭流。当您像那样从终端运行netcat时,终端默认为行缓冲,因此您输入的每一行都将作为单个写操作发送到服务器。
第一行被发送,由服务器读取,回显并关闭连接。Netcat获取第二行,将其写入套接字,并因服务器关闭连接而出现“Broken pipe”错误。 如果您想让您的服务器读取多个消息,则需要使您的handle_connection例程循环读取流,直到收到EOF。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接