熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java如何處理ICMP報文的收發

2013-11-23 18:41:09  來源: Java核心技術 

  前言

  java是跨平台語言一般來說對網絡的操作都在IP層以上也就是只能對tcp/udp進行操作當然也可以設置部分tcp/udp的option如果想再往IP層或者數據link層操作就無能為力了必須依靠jni使用本地OS的socket部分接口很幸運我在知道有winpcap的時候同時也知道有人在開發jpcap此包可以方便的操作網絡底層應用協議以下詳細描述

  實施步驟

  下載需要的包上可以下到最新的jpcap你只需要把lib中的dll文件拷貝到jre的bin目錄同時lib中的jar文件拷貝到jre中的lib/ext目錄下就安裝完整當然你可以使用exe安裝包進行安裝這樣會更加的簡單

  編碼你可以使用任何你喜歡的ide工具但是必須把jpcapjar加到classpath中否則無法編譯通過icmp有很多類型當前僅用echo類型為例也就是我們通過用的ping工具所產生的網絡行為以下為代碼詳細







    import InetAddress;

    import jpcapJpcapCaptor;
    import jpcapJpcapSender;
    import jpcapNetworkInterface;
    import jpcappacketEthernetPacket;
    import jpcappacketICMPPacket;
    import jpcappacketIPPacket;

    class ICMP
    {
        public static void main(String[] args) throws javaioIOException{
            NetworkInterface[] devices = JpcapCaptorgetDeviceList();
            if(argslength<){
                Systemoutprintln(Usage: java ICMP <device index (eg  )>);
                for(int i=;i<deviceslength;i++)
                    Systemoutprintln(i+:+devices[i]name+(+devices[i]description+));
                Systemexit();
            }
            int index=IntegerparseInt(args[]);
    //開啟網絡設備
            JpcapCaptor captor=JpcapCaptoropenDevice(devices[index]false);
    //設置只過濾 icmp包
            captorsetFilter(icmptrue);
            JpcapSender sender=captorgetJpcapSenderInstance();
            
            ICMPPacket p=new ICMPPacket();
            ptype=ICMPPacketICMP_ECHO;
            pseq=(short)x;
            pid=(short)x;
            
            psetIPvParameter(falsefalsefalsefalsefalsefalseIPPacketIPPROTO_ICMP
                InetAddressgetByName()InetAddressgetByName());
            pdata=abcdefghijklmnopqrstuvwabcdehghigetBytes();

            EthernetPacket ether=new EthernetPacket();
            etherframetype=EthernetPacketETHERTYPE_IP;
    //填寫自己和對方的mac地址必須要正確填寫如果有錯誤將無法收到回包
            etherdst_mac=new byte[]{(byte)x(byte)x(byte)xd(byte)x(byte)xd(byte)x};
            ethersrc_mac=new byte[]{(byte)x(byte)x(byte)x(byte)xad(byte)xc(byte)x};
            pdatalink=ether;

            
            sendersendPacket(p);
            Systemoutprintln(send);
            ICMPPacket rp= null;
            while(true){
                rp=(ICMPPacket)captorgetPacket();
                if(rp==null){
                    throw new IllegalArgumentException(no rcv icmp echo reply);
                }else
                {
                    Systemoutprintln(rcv icmp echo reply);
                    return ;
                }
            }
        }
    }

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25573.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.