Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets [Rust:UnixDatagram套接字]:地址已在使用Unix数据报套接字_Sockets_Rust - Fatal编程技术网

Sockets [Rust:UnixDatagram套接字]:地址已在使用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

我试图用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::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谢谢你的帮助。请不要编辑你的问题,一旦答案出来就完全改变它。相反