Можно ли передавать TcpStream между процессами

Добрый день.

Может кто знает, могу я через общую память между процессами передать TcpStream

В настоящий момент получаю ошибку

error[E0277]: the trait bound `std::net::TcpStream: shared_memory::cast::SharedMemCast` is not satisfied
  --> src/listener/mod.rs:50:43
   |
50 |         let mut shared_state = shared_mem.wlock::<TcpStream>( 1 )?;
   |                                           ^^^^^ the trait `shared_memory::cast::SharedMemCast` is not implemented for `std::net::TcpStream`

Как я понимаю нет реализации SharedMemCast для TcpStream. Может ее можно реализовать?

Если один процесс — подпроцесс другого, унаследовавший файловые дескрипторы родителя, то можно TcpStream на одной стороне преобразовать в номер файлового дескриптора с помощью .into_raw_fd(), а на другой восстановить с помощью ::from_raw_fd. RawFd — это просто c_int, поэтому его спокойно можно передавать. Естественно, всё это unsafe и валидно только для Unix-систем.

1 лайк

Да, я видел этот вариант. Спасибо!
В текущий момент есть желание передавать их между независимыми процессами.
Не могу только пока понять, вообще возможно в Linux такое?

Сделать это в лоб (расшарив TcpListener) точно нельзя.

Можно попробовать послать дескриптор через unix socket.

Я наверное просто не могу найти, как в Rust сделать так, что бы поток TcpStream не был удален после выполнения кода в одном процессе, а оставался в системе, что бы, после передачи его дескриптора в другой процесс, второй процесс мог отправить через него данные.
Подскажите, пожалуйста, где прочитать про это в документации можно?

Объект ядра удаляется в том момент, когда не один из процессов не держит на него дескриптор. Поэтому если дескриптор сокета был корректно передан в другой процесс, то все должно работать. Если вопрос в том, как именно передать дескриптор, то могу скинуть пару ссылок.
http://man7.org/linux/man-pages/man7/unix.7.html - в секции Ancillary messages первый же пункт, SCM_RIGHTS описывает как передавать дескрипторы.
https://docs.rs/nix - удобный интерфейс для многих системных интерфейсов, в том числе ancillary messages. (1, 2 и так далее).
https://docs.rs/tiny-nix-ipc - если оба процесса на расте, то это библиотека умеет перекидывать дескрипторы в одну строку.

Спасибо, большое. Буду читать!