Sockets [Rust:UnixDatagram套接字]:地址已在使用Unix数据报套接字
我试图用rust中的unix数据报套接字创建简单的客户机-服务器代码。我有一个问题,服务器保持地址在使用中,即使关闭了终端,所以它再也不会绑定套接字文件。启动时关闭套接字并创建新套接字的最佳方法是什么 下面是示例代码Sockets [Rust:UnixDatagram套接字]:地址已在使用Unix数据报套接字,sockets,rust,Sockets,Rust,我试图用rust中的unix数据报套接字创建简单的客户机-服务器代码。我有一个问题,服务器保持地址在使用中,即使关闭了终端,所以它再也不会绑定套接字文件。启动时关闭套接字并创建新套接字的最佳方法是什么 下面是示例代码 use std::fs::{File, read_to_string}; use std::fs; use std::os::unix::net::UnixDatagram; use std::path::{Path, PathBuf}; use std::net::Shutdow
use std::fs::{File, read_to_string};
use std::fs;
use std::os::unix::net::UnixDatagram;
use std::path::{Path, PathBuf};
use std::net::Shutdown;
fn unlink_socket (path: impl AsRef<Path>) {
let path = path.as_ref();
if Path::new(path).exists() {
std::fs::remove_file(path);
}
}
fn tcp_datagram_server() {
const FILE_PATH: &str = "/tmp/test.sock";
let socket;
let mut buf = vec![0; 4096];
unlink_socket(FILE_PATH);
File::create(FILE_PATH).expect("Unable to create file");
socket = match UnixDatagram::bind(FILE_PATH) {
Ok(socket) => socket,
Err(e) => {
println!("Couldn't bind: {:?}", e);
return;
}
};
println!("Waiting for client to connect...");
loop {
let data = socket.recv(buf.as_mut_slice()).expect("recv function failed");
println!("Received {:?}", data);
}
}
fn main() {
tcp_datagram_server();
}
使用std::fs::{File,read_to_string};
使用std::fs;
使用std::os::unix::net::UnixDatagram;
使用std::path::{path,PathBuf};
使用std::net::Shutdown;
fn取消链接_套接字(路径:impl AsRef){
设path=path.as_ref();
如果路径::新建(路径).exists(){
std::fs::删除_文件(路径);
}
}
fn tcp_数据报_服务器(){
常量文件路径:&str=“/tmp/test.sock”;
让插座;
设mut buf=vec![0;4096];
取消链接\u套接字(文件\u路径);
文件::创建(文件路径).expect(“无法创建文件”);
套接字=匹配UnixDatagram::bind(文件路径){
正常(插座)=>插座,
错误(e)=>{
println!(“无法绑定:{:?}”,e);
返回;
}
};
println!(“正在等待客户端连接…”);
环路{
让data=socket.recv(buf.as_mut_slice()).expect(“recv函数失败”);
println!(“收到{:?}”,数据);
}
}
fn main(){
tcp_数据报_服务器();
}
调用std::fs::remove_file()
成功了吗?删除对file::create
的调用。事实上,当你说你的代码第一次工作时,我很惊讶:它不适合我…@Jmb谢谢你的帮助。请不要编辑你的问题,一旦答案出来就完全改变它。相反