Взаимодействие двух программ по сети через многоадресное вещание

Нужно передать текстовую строку из одной программы в другую через многоадресное вещание (насколько я правильно понимаю для этого используются адреса 224.0.0.0 и выше).

Код взят отсюда https://github.com/bluejekyll/multicast-example/blob/master/src/lib.rs только сильно урезан, что бы передать суть проблемы

Программа отправитель:

extern crate socket2;
use std::io;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, UdpSocket};
use socket2::{Domain, Protocol, SockAddr, Socket, Type};

fn main() {

let socket = Socket::new(
    Domain::ipv4(),
    Type::dgram(),
    Some(Protocol::udp())
);

match socket {
    Result::Ok(sckt) => {
        sckt.set_multicast_if_v4(&Ipv4Addr::new(0, 0, 0, 0));
        sckt.bind(&SockAddr::from(SocketAddr::new(
            Ipv4Addr::new(0, 0, 0, 0).into(),
            7645,
        )));
        let udpsock=sckt.into_udp_socket();

        let message = b"Hello fromgiop client!";
        let socketaddr = SocketAddr::new(
            IpAddr::V4(Ipv4Addr::new(224,0,0,123)),
            7645
        );
        udpsock.send_to(message, &socketaddr).expect("could not send_to!");
    }
    Result::Err(err) =>panic!("called `Result::unwrap()` on an `Err` value: {:?}", err),
};
}

Программа получатель:

extern crate socket2;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, UdpSocket};
use socket2::{Domain, Protocol, SockAddr, Socket, Type};

 fn main() {
 let socket = Socket::new(
    Domain::ipv4(),
    Type::dgram(),
    Some(Protocol::udp())
);

match socket {
    Result::Ok(sckt) => {
        sckt.join_multicast_v4(
            &Ipv4Addr::new(224, 0, 0, 123),
            &Ipv4Addr::new(0, 0, 0, 0)
        );
        let addrbind=SocketAddr::new(
            Ipv4Addr::new(0, 0, 0, 0).into(),
            7645
        );
        sckt.bind(&socket2::SockAddr::from(addrbind));
        let udpsock=sckt.into_udp_socket();

        let mut buf = [0u8; 64];
        match udpsock.recv_from(&mut buf) {
            Ok((len, remote_addr)) => {
                let data = &buf[..len];
                println!(
                    "got data: {} from: {}",
                    String::from_utf8_lossy(data),
                    remote_addr
                );
            }
            Err(err) => {
                println!("{}:server: got an error: ", err);
            }
        }
    }
    Result::Err(err) =>panic!("called `Result::unwrap()` on an `Err` value: {:?}", err),
};
}

Это работает, если и отправитель и получатель запускаются на одном компьютере. Если запускать на разных компьютерах (компьютеры подключены к одной сети и находятся рядом), тогда не работает. Что нужно изменить?


Ответы (0 шт):