Advertisement
Guest User

Untitled

a guest
Jul 16th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.15 KB | None | 0 0
  1. extern crate getopts;
  2. extern crate pnet;
  3. extern crate rand;
  4.  
  5. // use getopts::Options;
  6. use std::env;
  7. use std::net::{IpAddr, Ipv4Addr};
  8. use std::str::FromStr;
  9. use pnet::transport::TransportChannelType::Layer4;
  10. use pnet::transport::TransportProtocol::Ipv4;
  11. use pnet::transport::{transport_channel, ipv4_packet_iter};
  12. use pnet::packet::icmp::{MutableIcmpPacket, IcmpTypes, echo_reply, echo_request, self};
  13. use pnet::packet::ip::IpNextHeaderProtocols;
  14.  
  15. fn create_ping_packet<'a>(empty_packet: &'a mut echo_request::MutableEchoRequestPacket, id: u16, seq_num: u16) {
  16.     empty_packet.set_icmp_type(IcmpTypes::EchoRequest);
  17.     empty_packet.set_icmp_code(echo_request::IcmpCodes::NoCode);
  18.     empty_packet.set_identifier(id);
  19.     empty_packet.set_sequence_number(seq_num);
  20.     //empty_packet.set_payload(b"Ring ring");
  21.     let checksum = empty_packet.get_checksum();
  22.     empty_packet.set_checksum(checksum);
  23. }
  24.  
  25. fn main() {
  26.     let args: Vec<String> = env::args().collect();
  27.     let host = args[args.len() - 1].clone();
  28.     let ip_address = IpAddr::V4(Ipv4Addr::from_str(&host).unwrap());
  29.  
  30.     let icmp_protocol = Layer4(Ipv4(IpNextHeaderProtocols::Icmp));
  31.     let buffer_size = 4096;
  32.     let (mut t_sender, mut t_receiver) = match transport_channel(buffer_size, icmp_protocol) {
  33.         Ok((t_sender, t_receiver)) => (t_sender, t_receiver),
  34.         Err(err) => panic!("{:?}", err),
  35.     };
  36.  
  37.     let id = rand::random::<u16>();
  38.     let mut seq_num = 0;
  39.     let mut empty_packet_contents : [u8; 32] = Default::default();
  40.     let mut empty_packet = echo_request::MutableEchoRequestPacket::new(&mut empty_packet_contents).unwrap();
  41.  
  42.     loop {
  43.         create_ping_packet(&mut empty_packet, id, seq_num);
  44.         let ping_packet : echo_request::EchoRequestPacket = empty_packet.to_immutable();
  45.         match t_sender.send_to(ping_packet, ip_address) {
  46.             Ok(_) => println!("Sent"),
  47.             Err(e) => panic!("{}", e),
  48.         }
  49.         let mut iter = ipv4_packet_iter(&mut t_receiver);
  50.         match iter.next() {
  51.             Ok((packet, _)) => println!("Received"),
  52.             Err(e) => println!("{}", e),
  53.         }
  54.         seq_num += 1;
  55.     }
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement