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