Я пытаюсь написать сервер, который будет читать из сокета Unix:
use std::io::prelude::*;
use std::os::unix::net::{UnixListener, UnixStream};
fn main() {
let socket_name = "socket";
let listener = match UnixListener::bind(&socket_name) {
Err(err) => panic!("Failed to bind to socket: {}.", err),
Ok(stream) => stream,
};
for mut stream in listener.incoming() {
match stream {
Ok(ref mut stream) => {
let msg = read(stream);
stream.write_all(msg.as_bytes()).expect("Echo");
}
Err(err) => panic!("Error occured when listening from the stream. {}", err),
}
}
fn read(stream: &mut UnixStream) -> String {
let mut s = String::new();
stream.read_to_string(&mut s).unwrap();
s
}
}
( детская площадка )
На стороне клиента я использую nc
: nc -U socket
.Я посылаю некоторые данные и заканчиваю их ^ D , которая должна быть EOF.Документы для read_to_string
говорят:
Считать все байты до EOF в этом источнике, добавив их в buf
Ожидаемое поведение: После отправки ^ D на стороне клиента сервер отвечает echo
Наблюдаемое поведение: сервер не распознает, что EOF был отправлен, и блокируется.Только когда клиент разрывает соединение, сервер печатает сообщение и panic
s с разорванным конвейером.