I have written code related to network communication interface which basically has functionalities of create socket and send & receive data. Currently this supports only IPV4 but facing lot of difficulties when making it to work with both IPV4 and IPV6.
use std::net::{UdpSocket, SocketAddrV4, Ipv4Addr};
use std::net::SocketAddr::V4;
use std::str::FromStr;
#[derive(Default)]
pub struct NetworkInterface {
socket: Option<UdpSocket>,
recv_sock_addr: Option<SocketAddrV4>,
send_sock_addr: Option<SocketAddrV4>,
}
impl NetworkInterface {
pub fn new() -> NetworkInterface {
NetworkInterface {
socket: None,
recv_sock_addr: None,
send_sock_addr: None,
}
}
pub fn bind_socket(&mut self, ip_addr: &str, port: u16) {
let pos = ip_addr.find('.').unwrap();
let first_octet: u8 = ip_addr[..pos].parse().unwrap();
if first_octet > 223 && first_octet < 240 {
self.recv_sock_addr = Some(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port));
} else {
self.recv_sock_addr = Some(SocketAddrV4::new(Ipv4Addr::from_str(ip_addr).unwrap(), port));
}
self.socket = Some(UdpSocket::bind(self.recv_sock_addr.as_ref().unwrap()).unwrap());
if first_octet > 223 && first_octet < 240 {
let _ = self.socket.as_ref().unwrap().join_multicast_v4(&Ipv4Addr::from_str(ip_addr).unwrap(), &Ipv4Addr::UNSPECIFIED);
}
}
pub fn set_send_sock_addr(&mut self, ip_addr: &str, port: u16) {
self.send_sock_addr = Some(SocketAddrV4::new(Ipv4Addr::from_str(ip_addr).unwrap(), port));
let pos = ip_addr.find('.').unwrap();
let first_octet: u8 = ip_addr[..pos].parse().unwrap();
if first_octet > 223 && first_octet < 240 {
self.socket.as_ref().unwrap().set_multicast_loop_v4(false).expect("set_multicast_loop_v4 call failed");
}
}
pub fn recv_data(&self, buff: &mut[u8]) -> usize {
let(recvd_bytes_len, _) = self.socket.as_ref().unwrap().recv_from(buff).expect("error while receiving data");
recvd_bytes_len
}
pub fn send_data(&self, buff: &[u8]) {
self.socket.as_ref().unwrap().send_to(buff, self.send_sock_addr.as_ref().unwrap()).expect("error while sending data");
}
pub fn get_host_bound_port(&self) -> u16 {
self.socket.as_ref().unwrap().local_addr().unwrap().port()
}
pub fn update_send_sock_addr(&mut self) {
let mut buff: [u8; 2048] = [0; 2048];
let (_, send_sock_addr) = self.socket.as_ref().unwrap().recv_from(&mut buff).expect("error while receiving data during sender IP address updating");
match send_sock_addr {
V4(ip_addr) => self.send_sock_addr = Some(ip_addr),
_ => {}
}
}
}
.unwrap()a lot. Consider handling the errors instead of risking panics. \$\endgroup\$2048? \$\endgroup\$