rust - 如何通过Rust中的Unix套接字发送和收听数据?

标签 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(())
}

最佳答案

调用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(())
}

关于rust - 如何通过Rust中的Unix套接字发送和收听数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60558757/

相关文章:

rust - Rust 中的指针取消引用

rust - 如何向 `Child` 子进程发送信号?

generics - 了解Rust中的通用FromIterator

rust - 强制 reqwest 定期重新建立连接以实现负载平衡

rust - 如何从 Pin<Arc<Mutex<T>>> 中获取 Pin<&mut T>

docker - 标准_init_linux.go :219: exec user process caused: no such file or directory

rust - 如何指定依赖项的确切版本?

rust - 如何返回指向拥有值 "does not live long enough"的指针?

windows - Rust Serialport-RS 读取被阻止

rust - 为什么 `Idx` 特征的 `Index` 类型参数允许取消大小?