Struct cross_socket::socket::ListenerSocket
source · pub struct ListenerSocket { /* private fields */ }
Expand description
Receive all IPv4 or IPv6 packets passing through a network interface
Implementations§
source§impl ListenerSocket
impl ListenerSocket
sourcepub fn new(
_socket_addr: SocketAddr,
ip_version: IpVersion,
protocol: Option<IpNextLevelProtocol>,
timeout: Option<Duration>
) -> Result<ListenerSocket>
pub fn new( _socket_addr: SocketAddr, ip_version: IpVersion, protocol: Option<IpNextLevelProtocol>, timeout: Option<Duration> ) -> Result<ListenerSocket>
Examples found in repository?
examples/socket/udp.rs (line 27)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
fn main() {
let interface: Interface = cross_socket::interface::get_default_interface().unwrap();
let src_ip: IpAddr = IpAddr::V4(interface.ipv4[0].addr);
let src_socket_addr: SocketAddr = SocketAddr::new(src_ip, 0);
let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
let dst_socket_addr: SocketAddr = SocketAddr::new(dst_ip, 33435);
let socket_option = SocketOption {
ip_version: IpVersion::V4,
socket_type: SocketType::Dgram,
protocol: Some(IpNextLevelProtocol::Udp),
timeout: None,
ttl: None,
non_blocking: false,
};
// Sender socket
let socket: Socket = Socket::new(socket_option).unwrap();
// Receiver socket
let listener_socket: ListenerSocket = ListenerSocket::new(src_socket_addr, IpVersion::V4, None, Some(Duration::from_millis(1000))).unwrap();
// Create packet info
let mut packet_info = PacketInfo::new();
packet_info.src_ip = src_ip;
packet_info.dst_ip = dst_socket_addr.ip();
packet_info.src_port = Some(53443);
packet_info.dst_port = Some(dst_socket_addr.port());
packet_info.ip_protocol = Some(IpNextLevelProtocol::Udp);
packet_info.payload = vec![0; 0];
// Build UDP packet
let udp_packet = cross_socket::packet::builder::build_udp_packet(packet_info);
// Send UDP packets to 1.1.1.1:33435
match socket.send_to(&udp_packet, dst_socket_addr) {
Ok(packet_len) => {
println!("Sent {} bytes", packet_len);
}
Err(e) => {
println!("Error: {}", e);
}
}
// Receive ICMP Port Unreachable packets
println!("Waiting for ICMP Destination (Port) Unreachable...");
let mut buf = vec![0; 512];
loop {
match listener_socket.receive_from(&mut buf){
Ok((packet_len, _)) => {
let ip_packet = cross_socket::packet::ipv4::Ipv4Packet::from_bytes(&buf[..packet_len]);
if ip_packet.next_level_protocol != IpNextLevelProtocol::Icmp || ip_packet.source != std::net::Ipv4Addr::new(1, 1, 1, 1) {
continue;
}
println!("Received {} bytes from {}", packet_len, ip_packet.source);
let icmp_packet = cross_socket::packet::icmp::IcmpPacket::from_bytes(&ip_packet.payload);
println!("Packet: {:?}", icmp_packet);
break;
}
Err(e) => {
println!("Error: {}", e);
}
}
}
}
sourcepub fn receive_from(&self, buf: &mut Vec<u8>) -> Result<(usize, SocketAddr)>
pub fn receive_from(&self, buf: &mut Vec<u8>) -> Result<(usize, SocketAddr)>
Examples found in repository?
examples/socket/udp.rs (line 55)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
fn main() {
let interface: Interface = cross_socket::interface::get_default_interface().unwrap();
let src_ip: IpAddr = IpAddr::V4(interface.ipv4[0].addr);
let src_socket_addr: SocketAddr = SocketAddr::new(src_ip, 0);
let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
let dst_socket_addr: SocketAddr = SocketAddr::new(dst_ip, 33435);
let socket_option = SocketOption {
ip_version: IpVersion::V4,
socket_type: SocketType::Dgram,
protocol: Some(IpNextLevelProtocol::Udp),
timeout: None,
ttl: None,
non_blocking: false,
};
// Sender socket
let socket: Socket = Socket::new(socket_option).unwrap();
// Receiver socket
let listener_socket: ListenerSocket = ListenerSocket::new(src_socket_addr, IpVersion::V4, None, Some(Duration::from_millis(1000))).unwrap();
// Create packet info
let mut packet_info = PacketInfo::new();
packet_info.src_ip = src_ip;
packet_info.dst_ip = dst_socket_addr.ip();
packet_info.src_port = Some(53443);
packet_info.dst_port = Some(dst_socket_addr.port());
packet_info.ip_protocol = Some(IpNextLevelProtocol::Udp);
packet_info.payload = vec![0; 0];
// Build UDP packet
let udp_packet = cross_socket::packet::builder::build_udp_packet(packet_info);
// Send UDP packets to 1.1.1.1:33435
match socket.send_to(&udp_packet, dst_socket_addr) {
Ok(packet_len) => {
println!("Sent {} bytes", packet_len);
}
Err(e) => {
println!("Error: {}", e);
}
}
// Receive ICMP Port Unreachable packets
println!("Waiting for ICMP Destination (Port) Unreachable...");
let mut buf = vec![0; 512];
loop {
match listener_socket.receive_from(&mut buf){
Ok((packet_len, _)) => {
let ip_packet = cross_socket::packet::ipv4::Ipv4Packet::from_bytes(&buf[..packet_len]);
if ip_packet.next_level_protocol != IpNextLevelProtocol::Icmp || ip_packet.source != std::net::Ipv4Addr::new(1, 1, 1, 1) {
continue;
}
println!("Received {} bytes from {}", packet_len, ip_packet.source);
let icmp_packet = cross_socket::packet::icmp::IcmpPacket::from_bytes(&ip_packet.payload);
println!("Packet: {:?}", icmp_packet);
break;
}
Err(e) => {
println!("Error: {}", e);
}
}
}
}
Auto Trait Implementations§
impl RefUnwindSafe for ListenerSocket
impl Send for ListenerSocket
impl Sync for ListenerSocket
impl Unpin for ListenerSocket
impl UnwindSafe for ListenerSocket
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more