Как отправить и прослушать данные через unix розетки в ржавчине? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь использовать unix сокеты для связи между node.js и ржавчиной. Я хотел бы слушать и отправлять сообщения с помощью скрипта ржавчины, однако буквально каждый пример, который я нашел в inte rnet, показывает, как это сделать (либо прослушать, либо отправить), либо использует сторонний инструмент.

Я пытаюсь отправить сообщение клиенту, как только он подключится, но он этого не делает. (останавливается после сообщения «Получил клиента»)

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

1 Ответ

1 голос
/ 06 марта 2020

Когда вы вызываете UnixStream::connect, вы пытаетесь открыть второе соединение, которое зацикливается от вашего кода ржавчины на себя, но это второе соединение никогда не принимается, потому что ваш код принимает только один раз, и он уже принял соединение от узла.

Вместо этого вы должны использовать сокет, возвращенный 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(())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...