我有一个测试程序,它打开并监听 Unix Domain Socket。套接字已经打开并能够读取数据,但它无法正常关闭。
当我尝试第二次运行测试时,会出现以下错误:
“线程'test_1'在一个'Err'值上调用'Result::unwrap()'方法: 错误{repr:Os {code:48, message:"Address already in use"}}”,../src/libcore/result.rs:799 注意:使用'RUST_BACKTRACE=1'来获取回溯信息。
代码可以在Rust Playground中查看,也可以在Github Gist中找到。
当我尝试第二次运行测试时,会出现以下错误:
“线程'test_1'在一个'Err'值上调用'Result::unwrap()'方法: 错误{repr:Os {code:48, message:"Address already in use"}}”,../src/libcore/result.rs:799 注意:使用'RUST_BACKTRACE=1'来获取回溯信息。
代码可以在Rust Playground中查看,也可以在Github Gist中找到。
use std::io::prelude::*;
use std::thread;
use std::net::Shutdown;
use std::os::unix::net::{UnixStream, UnixListener};
测试用例:
#[test]
fn test_1() {
driver();
assert_eq!("1", "2");
}
主入口点函数
fn driver() {
let listener = UnixListener::bind("/tmp/my_socket.sock").unwrap();
thread::spawn(|| socket_server(listener));
// send a message
busy_work(3);
// try to disconnect the socket
let drop_stream = UnixStream::connect("/tmp/my_socket.sock").unwrap();
let _ = drop_stream.shutdown(Shutdown::Both);
}
定时发送数据的函数
#[allow(unused_variables)]
fn busy_work(threads: i32) {
// Make a vector to hold the children which are spawned.
let mut children = vec![];
for i in 0..threads {
// Spin up another thread
children.push(thread::spawn(|| socket_client()));
}
for child in children {
// Wait for the thread to finish. Returns a result.
let _ = child.join();
}
}
fn socket_client() {
let mut stream = UnixStream::connect("/tmp/my_socket.sock").unwrap();
stream.write_all(b"hello world").unwrap();
}
处理数据的函数
fn handle_client(mut stream: UnixStream) {
let mut response = String::new();
stream.read_to_string(&mut response).unwrap();
println!("got response: {:?}", response);
}
监听传入消息的服务器套接字
#[allow(unused_variables)]
fn socket_server(listener: UnixListener) {
// accept connections and process them, spawning a new thread for each one
for stream in listener.incoming() {
match stream {
Ok(mut stream) => {
/* connection succeeded */
let mut response = String::new();
stream.read_to_string(&mut response).unwrap();
if response.is_empty() {
break;
} else {
thread::spawn(|| handle_client(stream));
}
}
Err(err) => {
/* connection failed */
break;
}
}
}
println!("Breaking out of socket_server()");
drop(listener);
}