TCP流中何时发生断开的管道?

TCP流中何时发生断开的管道?

问题描述:

我想在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

发生A“管道中断”消息。在你的例子中,你的例程从客户端读取单个缓冲区,将其复制回客户端,然后返回,这将关闭流。当您从终端运行netcat时,终端默​​认为行缓冲,因此您键入的每行都将作为单个写入发送到服务器。

第一行发送,由服务器读取,回显,然后服务器关闭连接。 Netcat得到第二行,将它写入套接字,并且因为服务器关闭了连接而得到“损坏的管道”。

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

+0

谢谢。这解决了我的问题。 – codeNoob