From a7b7a068a0e27dcf275b3d29b3b71702da3c3207 Mon Sep 17 00:00:00 2001 From: shellrow <81893184+shellrow@users.noreply.github.com> Date: Sun, 11 Apr 2021 03:00:31 +0900 Subject: [PATCH] Update lib.rs --- src/lib.rs | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 576f853..99cef75 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,36 +1,17 @@ use std::net::UdpSocket; use pnet::transport::TransportChannelType::Layer4; use pnet::transport::TransportProtocol::Ipv4; -//use std::time; use std::time::{Duration, Instant}; use std::net::IpAddr; -//use pnet::packet::Packet; use pnet::transport::icmp_packet_iter; -use pnet::packet::Packet; use pnet::datalink; +#[cfg(target_os = "windows")] +use pnet::packet::Packet; + pub fn get_default_gateway() -> Result { - /* - let buf = [0u8; 0]; - let socket = match UdpSocket::bind("0.0.0.0:0") { - Ok(s) => s, - Err(_) => panic!("error!"), - }; - let dest: &str = "192.168.11.1:80"; - socket.set_ttl(1).unwrap(); - socket.send_to(&buf, dest).unwrap(); - */ send_udp_packet(); - /* - let protocol = Layer4(Ipv4(pnet::packet::ip::IpNextHeaderProtocols::Icmp)); - let (mut _tx, mut rx) = match pnet::transport::transport_channel(4096, protocol) { - Ok((tx, rx)) => (tx, rx), - Err(e) => panic!("Error happened {}", e), - }; let timeout = Duration::from_millis(3000); - */ - let timeout = Duration::from_millis(3000); - //let r = receive_icmp_packets(&mut rx, pnet::packet::icmp::IcmpTypes::TimeExceeded, &timeout); let r = receive_icmp_packets(pnet::packet::icmp::IcmpTypes::TimeExceeded, &timeout); return r; } @@ -41,7 +22,7 @@ pub fn send_udp_packet(){ Ok(s) => s, Err(_) => panic!("error!"), }; - let dest: &str = "192.168.11.1:80"; + let dest: &str = "8.8.8.8:80"; socket.set_ttl(1).unwrap(); socket.send_to(&buf, dest).unwrap(); } @@ -115,12 +96,12 @@ fn receive_icmp_packets(icmp_type: pnet::packet::icmp::IcmpType, timeout: &Durat let default_idx = get_default_interface_index().unwrap(); let interfaces = pnet::datalink::interfaces(); let interface = interfaces.into_iter().filter(|interface: &pnet::datalink::NetworkInterface| interface.index == default_idx).next().expect("Failed to get Interface"); - let (mut _sender, mut receiver) = match datalink::channel(&interface, Default::default()) { + let (mut _tx, mut rx) = match datalink::channel(&interface, Default::default()) { Ok(pnet::datalink::Channel::Ethernet(tx, rx)) => (tx, rx), Ok(_) => panic!("Unknown channel type"), Err(e) => panic!("Error happened {}", e), }; - receive_packets(&mut receiver, timeout) + receive_packets(&mut rx, timeout) } #[cfg(target_os = "windows")] @@ -158,6 +139,7 @@ fn receive_packets(rx: &mut Box, timeout: } } +#[cfg(target_os = "windows")] fn ipv4_handler(ethernet: &pnet::packet::ethernet::EthernetPacket) -> Option { if let Some(packet) = pnet::packet::ipv4::Ipv4Packet::new(ethernet.payload()){ match packet.get_next_level_protocol() { @@ -173,6 +155,7 @@ fn ipv4_handler(ethernet: &pnet::packet::ethernet::EthernetPacket) -> Option Option { if let Some(packet) = pnet::packet::ipv6::Ipv6Packet::new(ethernet.payload()){ match packet.get_next_header() { @@ -188,6 +171,7 @@ fn ipv6_handler(ethernet: &pnet::packet::ethernet::EthernetPacket) -> Option Option { if let Some(packet) = pnet::packet::icmp::IcmpPacket::new(ip_packet.payload()){ if packet.get_icmp_type() == pnet::packet::icmp::IcmpTypes::TimeExceeded { @@ -201,6 +185,7 @@ fn icmp_handler(ip_packet: &pnet::packet::ipv4::Ipv4Packet) -> Option { } } +#[cfg(target_os = "windows")] fn icmpv6_handler(ip_packet: &pnet::packet::ipv6::Ipv6Packet) -> Option { if let Some(packet) = pnet::packet::icmp::IcmpPacket::new(ip_packet.payload()){ if packet.get_icmp_type() == pnet::packet::icmp::IcmpTypes::TimeExceeded {