JPCAP捕获ARP数据包

主要程序如下:

 

public class ARPMsg implements Runnable {

     static JpcapCaptor captor;

     static NetworkInterface[] devices;

     static BufferedReader in = new BufferedReader(new InputStreamReader( 

     System.in));                            

     static int i = 0;

     static String str;

     static IPPacket p;

     static IPPacket ip;

     static boolean bl = true;

 

    

    public static void main(String[] args) {

         System.out.println(" ..... ARP ....");

         nic();

         try {

           captor = JpcapCaptor.openDevice(devices[i], 65535, false, 2000);  // 创建一个与指定设备的连接并返回该连接

           captor.setFilter("arp", true);                  //过滤得到需要的 ARP

         } catch (IOException e) {

         System.out.println(e.getMessage());

         }


         Runnable runnable = new ARPMsg();

         Thread thread = new Thread(runnable);            //开启一个子线程监听 ARP 报文

         thread.setName("thread1");

         thread.setPriority(6);

         thread.start();


         Scanner s = new Scanner(System.in);         // main 线程中 , ,输入 "exit" 用于停止监听

         String input = s.next();

         if (input.equals("exit"))

             System.exit(0); //normal exit

         }

 

 

    public void run() {                                     //子线程thread1运行时调用的方法

         while (bl) {

           captor.processPacket(1, handler);                //监听并捕获 ARP

         }

    }


 

    public static int nic() {

        devices = JpcapCaptor.getDeviceList();                // 返回一个网络设备列表

        for (int i = 0; i < devices.length; i++) {            //打印可选设备的网卡信息

             System.out.println(i + ". > " + "NIO_gen_eth: " + devices[i].name);

            for (NetworkInterfaceAddress a : devices[i].addresses) {

                System.out.println("   IP address:" + a.address);

            }

        }


        System.out.print("> Choose the NIC you want to use: ");

        try {

            str = in.readLine();                            //输入数字并选择网卡

        } catch (IOException e) {

        System.out.println(e.getMessage());

        }

        i = Integer.parseInt(str);

        return i;

}


 

     private static PacketReceiver handler = new PacketReceiver() {

         public void receivePacket(Packet packet) {          //匿名类,每捕获一个包就调用此方法

              System.out.println("===================================");

             if(Short.valueOf(ARPPacket.ARP_REQUEST).equals(((ARPPacket) packet).opration))

             {

                 System.out.println("This is arp request message");

             }

             if(Short.valueOf(ARPPacket.ARP_REPLY).equals(((ARPPacket) packet).operation))

            {

                  System.out.println("This is arp reply message");

             }

             System.out.println("硬件类型       " + ((ARPPacket) packet).hardtype);

             System.out.println("操作类型       " + ((ARPPacket) packet).operation);

             System.out.println(" MAC 地址 " + ((ARPPacket) packet).getSenderHardwareAddress());  

             System.out.println(" IP 地址   " + ((ARPPacket) packet).getSenderProtocolAddress());  

             System.out.println("目标 MAC 地址    " + ((ARPPacket) packet).getTargetHardwareAddress());

              System.out.println("目标 IP 地址     " + ((ARPPacket) packet).getTargetProtocolAddress());

             System.out.println("===================================");

 

        }

    };


 

 

}


    本程序采用多线程的实现对ARP 数据包进行监听并捕获,首先 JpcapCaptor.getDeviceList() 获得可用的设备,并输出以供用户选择,当用户选择并输入可用的设备号后, JpcapCaptor.openDevice() 创建一个与所选设备的连接, false 参数表示启用混杂模式, captor.setFilter("arp",true) 过滤得到 ARP 数据包,这时开启一个叫做 JARP 的子线程,运行 captor.processPacket(1, handler) 方法用于捕获 ARP 数据包,一旦 ARP 数据包出现,交由 PacketReceiver 接口的唯一实现方法 receivePacket() 来处理。与此同时,在另外一个 main 线程中,通过 new Scanner(System.in) 来指定当输入字符 "exit" 时,程序退出。之所以在 main 线程而不是在子线程来指定输入的字符 "exit" ,是因为 System.in 是一个阻塞函数,若在子线程中会阻断子线程监听捕获 ARP 数据包。

 

 

如若转载,请说明出处!http://blog.csdn.net/xukunddp

你可能感兴趣的:(thread,多线程,String,网络)