network_search 0.1.5

the tools which is useful for searching networks
Documentation

pub mod ip{
    use pnet::packet::ipv4::{Ipv4Packet, MutableIpv4Packet};
    use pnet::packet::ip::IpNextHeaderProtocol;
    use pnet::transport::{TransportChannelType, transport_channel, ipv4_packet_iter};
    use pnet::packet::Packet;

    use std::net::{IpAddr,Ipv4Addr};
    use std::time::Duration;
    use std::io::{Error, ErrorKind};

    pub fn make_ip_packet(ip: &mut MutableIpv4Packet, target_ip: Ipv4Addr, next_level_protocol: IpNextHeaderProtocol) {
        ip.set_version(4);
        ip.set_header_length(5);
        ip.set_total_length(28);
        ip.set_identification(1);
        ip.set_ttl(1);
        ip.set_next_level_protocol(next_level_protocol);
        ip.set_destination(target_ip);
    }

    pub fn send_recv_packet(ip: &mut MutableIpv4Packet,ttl: u8,next_level_protocol: IpNextHeaderProtocol) -> Result<Ipv4Addr,Error>{

        let (mut tx, mut rx) = match transport_channel(512, TransportChannelType::Layer3(next_level_protocol)){
          Ok(tx_rx) => tx_rx,
          Err(e) => return Err(e)
        };
        // 一応ipパケットを受信する
        let mut rx = ipv4_packet_iter(&mut rx);
      
      
        ip.set_ttl(ttl);
      
        let ipv4 = Ipv4Packet::new(&ip.packet()).unwrap();
        tx.send_to(ipv4, IpAddr::V4(ip.get_destination())).unwrap();
      
        loop {
          match rx.next_with_timeout(Duration::new(1, 0)) {
            Ok(ip_response) => {
              let packet = match ip_response {
                Some((p, _)) => p.packet().to_vec(),
                None => return Err(Error::new(ErrorKind::Other, "oh no!")),
              };
              let i_pac = Ipv4Packet::new(&packet).unwrap();

              return Ok(i_pac.get_source())
            }
            Err(e) => {
              return Err(e);
            }
          }
        }
      
        
      }
}