Advertisement
Guest User

Untitled

a guest
Jul 15th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.21 KB | None | 0 0
  1. extern crate pnet;
  2.  
  3. // use getopts::Options;
  4. use std::env;
  5. use std::net::{IpAddr, Ipv4Addr};
  6. use std::str::FromStr;
  7. use pnet::transport::TransportChannelType::Layer4;
  8. use pnet::transport::TransportProtocol::Ipv4;
  9. use pnet::transport::{transport_channel, ipv4_packet_iter};
  10. use pnet::packet::icmp::{MutableIcmpPacket, IcmpTypes, echo_reply, echo_request, self};
  11. use pnet::packet::ip::IpNextHeaderProtocols;
  12.  
  13. fn create_ping_packet<'a>(sequence_number: u16) -> echo_request::MutableEchoRequestPacket<'a> {
  14.     let mut packet_contents = [0; 48];
  15.     let mut ping_packet = echo_request::MutableEchoRequestPacket::new(&mut packet_contents[20..]).unwrap();
  16.     ping_packet.set_icmp_type(IcmpTypes::EchoRequest);
  17.     ping_packet.set_icmp_code(echo_request::IcmpCodes::NoCode);
  18.     ping_packet.set_identifier(902);
  19.     ping_packet.set_sequence_number(sequence_number);
  20.     ping_packet.set_payload(b"Ring ring");
  21.     ping_packet
  22. }
  23.  
  24. fn main() {
  25.     let args: Vec<String> = env::args().collect();
  26.     let host = args[args.len() - 1].clone();
  27.     let ip_address = IpAddr::V4(Ipv4Addr::from_str(&host).unwrap());
  28.  
  29.     // TODO: Command line arguement checking
  30.     // let mut opts = Options::new();
  31.     // opts.optopt("o", "", "set output file name", "NAME");
  32.     // opts.optflag("h", "help", "print this help menu");
  33.     // let matches = match opts.parse(&args[1..]) {
  34.         // Ok(m) => { m }
  35.         // Err(f) => { panic!(f.to_string()) }
  36.     // };
  37.  
  38.     let icmp_protocol = Layer4(Ipv4(IpNextHeaderProtocols::Icmp));
  39.     let buffer_size = 4096;
  40.     let (mut t_sender, mut t_receiver) = match transport_channel(buffer_size, icmp_protocol) {
  41.         Ok((t_sender, t_receiver)) => (t_sender, t_receiver),
  42.         Err(err) => panic!("{:?}", err),
  43.     };
  44.  
  45.     let mut sequence_number = 0;
  46.     loop {
  47.         let mut iter = ipv4_packet_iter(&mut t_receiver);
  48.         let packet = create_ping_packet(sequence_number);
  49.         match t_sender.send_to(packet, ip_address) {
  50.             Ok(_) => println!("Sent"),
  51.             Err(e) => panic!("{}", e),
  52.         }
  53.         match iter.next() {
  54.             Ok((packet, _)) => println!("Received"),
  55.             Err(e) => println!("{}", e),
  56.         }
  57.         sequence_number += 1;
  58.     }
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement