Advertisement
Guest User

Untitled

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