如何通过 Rust 中的 unix 套接字发送和监听数据?

gyu*_*ula 2 rust

我正在尝试使用unix套接字在node.js和rust之间进行通信。我想通过 rust 脚本收听和发送消息,但是实际上我在互联网上找到的每个示例都展示了如何执行此操作(收听或发送)或使用第三方工具。

我试图在客户端连接后立即向其发送消息,但它并没有这样做。(它在“有客户”消息后停止)

use std::os::unix::net::{UnixStream,UnixListener};
use std::io::prelude::*;

fn main() -> std::io::Result<()> {
    let listener = UnixListener::bind("/tmp/rst.sock")?;

    match listener.accept() {
        Ok((socket, addr)) => {
            let mut stream = UnixStream::connect("/tmp/rst.sock")?;
            println!("Got a client: {:?} - {:?}", socket, addr);
            stream.write_all(b"hello world")?;
            let mut response = String::new();
            stream.read_to_string(&mut response)?;
            println!("{}", response);
        },
        Err(e) => println!("accept function failed: {:?}", e),
    }
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

Jmb*_*Jmb 7

当您调用 时UnixStream::connect,您试图打开第二个连接,该连接从您的 rust 代码循环到自身,但第二个连接永远不会被接受,因为您的代码只接受一次并且它已经接受了来自 Node 的连接。

相反,您应该使用直接返回的套接字accept

use std::os::unix::net::UnixListener;
use std::io::prelude::*;

fn main() -> std::io::Result<()> {
    let listener = UnixListener::bind("/tmp/rst.sock")?;

    match listener.accept() {
        Ok((mut socket, addr)) => {
            println!("Got a client: {:?} - {:?}", socket, addr);
            socket.write_all(b"hello world")?;
            let mut response = String::new();
            socket.read_to_string(&mut response)?;
            println!("{}", response);
        },
        Err(e) => println!("accept function failed: {:?}", e),
    }
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)