【发布时间】:2019-05-07 04:14:14
【问题描述】:
我正在尝试编写一个将从 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。我发送一些数据并以应该是 EOF 的 ^D 结束。 read_to_string 的文档说:
读取此源中 EOF 之前的所有字节,并将它们附加到 buf
预期行为: 在客户端发送 ^D 后,服务器以 echo 响应
观察到的行为:
服务器无法识别 EOF 已发送并阻止。只有当客户端断开连接时,服务器才会打印消息和带有断开管道的panics。
【问题讨论】: