<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    備注學院

    LuLu

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks

     半年前網絡技術課的老師要我們做個ARP查詢,老師是教人用winsock的,可我一味鉆java,干著急,鉆進java世界到處查,終于找到這么一個東西。

    然后做了一個ARP監聽器,沒想到被老師看上了,說是國內JPCAP研究的人不多,可以考慮寫一篇論文,老師給我推薦發表。

    于是有了這么一篇東西。不過現在還不知道老師發哪個刊物去了。。。老師說,還沒回音。。

     注:由于字數限制,分成2部分發。

     

     

    JPCAP——JAVA中的數據鏈路層控制
     
    一.JPCAP簡介
    眾所周知,JAVA語言雖然在TCP/UDP傳輸方面給予了良好的定義,但對于網絡層以下的控制,卻是無能為力的。JPCAP擴展包彌補了這一點。
    JPCAP實際上并非一個真正去實現對數據鏈路層的控制,而是一個中間件,JPCAP調用wincap/libpcap,而給JAVA語言提供一個公共的接口,從而實現了平臺無關性。在官方網站上聲明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系統。
    二.JPCAP機制
           JPCAP的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincaptypedef struct _ADAPTER  ADAPTERgetDeviceList()對應pcap_findalldevs()等等。 JPCAP有16個類,下面就其中最重要的4個類做說明。
     
    1.NetworkInterface
    該類的每一個實例代表一個網絡設備,一般就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。
     

    數據成員
    NetworkInterfaceAddress[]
    addresses
        這個接口的網絡地址。設定為數組應該是考慮到有些設備同時連接多條線路,例如路由器。但我們的PC機的網卡一般只有一條線路,所以我們一般取addresses[0]就夠了。
     java.lang.String
    datalink_description.
        數據鏈路層的描述。描述所在的局域網是什么網。例如,以太網(Ethernet)、無線LAN網(wireless LAN)、令牌環網(token ring)等等。
     java.lang.String
    datalink_name
       該網絡設備所對應數據鏈路層的名稱。具體來說,例如Ethernet10M、100M、1000M等等。
     java.lang.String
    description
       網卡是XXXX牌子XXXX型號之類的描述。例如我的網卡描述:Realtek RTL8169/8110 Family Gigabit Ethernet NIC
     boolean
    Loopback
        標志這個設備是否loopback設備。
     byte[]
    mac_address
       網卡的MAC地址,6個字節。
     java.lang.String
    Name
        這個設備的名稱。例如我的網卡名稱:\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}

     
    2.JpcapCaptor
    該類提供了一系列靜態方法實現一些基本的功能。該類一個實例代表建立了一個與指定設備的鏈接,可以通過該類的實例來控制設備,例如設定網卡模式、設定過濾關鍵字等等。
     

    數據成員
     int
    dropped_packets 
    拋棄的包的數目。
    protected  int
    ID
        這個數據成員在官方文檔中并沒有做任何說明,查看JPCAP源代碼可以發現這個ID實際上在其JNIC代碼部分傳進來的,這類本身并沒有做出定義,所以是供其內部使用的。實際上在對JpcapCator實例的使用中也沒有辦法調用此數據成員。
    protected static boolean[]
    instanciatedFlag
       同樣在官方文檔中沒有做任何說明,估計其為供內部使用。
    protected static int
    MAX_NUMBER_OF_INSTANCE
    同樣在官方文檔中沒有做任何說明,估計其為供內部使用。
    int
    received_packets
            
    收到的包的數目
    方法成員
    static NetworkInterface[]
    getDeviceList()
              
    返回一個網絡設備列表。
    static JpcapCaptor
    openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms)
            
    創建一個與指定設備的連接并返回該連接。注意,以上兩個方法都是靜態方法。
          Interface:要打開連接的設備的實例;
          Snaplen:這個是比較容易搞混的一個參數。其實這個參數不是限制只能捕捉多少數據包,而是限制每一次收到一個數據包,只提取該數據包中前多少字節;
          Promisc:設置是否混雜模式。處于混雜模式將接收所有數據包,若之后又調用了包過濾函數setFilter()將不起任何作用;
          To_ms:這個參數主要用于processPacket()方法,指定超時的時間;
     void
    Close()
              
    關閉調用該方法的設備的連接,相對于openDivece()打開連接。
     JpcapSender
    getJpcapSenderInstance()
             
    該返回一個JpcapSender實例,JpcapSender類是專門用于控制設備的發送數據包的功能的類。
     Packet
    getPacket()
              
    捕捉并返回一個數據包。這是JpcapCaptor實例中四種捕捉包的方法之一。
     int
    loopPacket(int count, PacketReceiver handler)
             
    捕捉指定數目的數據包,并交由實現了PacketReceiver接口的類的實例處理,并返回捕捉到的數據包數目。如果count參數設為-1,那么無限循環地捕捉數據。
          這個方法不受超時的影響。還記得openDivice()中的to_ms參數么?那個參數對這個方法沒有影響,如果沒有捕捉到指定數目數據包,那么這個方法將一直阻塞等待。
    PacketReceiver中只有一個抽象方法void receive(Packet p)
     int
    processPacket(int count, PacketReceiver handler)
              
    loopPacket()功能一樣,唯一的區別是這個方法受超時的影響,超過指定時間自動返回捕捉到數據包的數目。
     int
    dispatchPacket(int count, PacketReceiver handler)
            
    processPacket()功能一樣,區別是這個方法可以處于“non-blocking”模式工作,在這種模式下dispatchPacket()可能立即返回,即使沒有捕捉到任何數據包。
     void
    setFilter(java.lang.String condition, boolean optimize)
              .
    condition設定要提取的包的關鍵字。
           Optimize:這個參數在說明文檔以及源代碼中都沒有說明,只是說這個參數如果為真,那么過濾器將處于優化模式。
     void
    setNonBlockingMode(boolean nonblocking)
         如果值為“true”,那么設定為“non-blocking”模式。
     void
    breakLoop()
         當調用processPacket()loopPacket()后,再調用這個方法可以強制讓processPacket()loopPacket()停止。

     
    3.JpcapSender
    該類專門用于控制數據包的發送。
     

    方法成員
     void
    close()
             
    強制關閉這個連接。
    static JpcapSender
    openRawSocket()
         這個方法返回的JpcapSender實例發送數據包時將自動填寫數據鏈路層頭部分。
     void
    sendPacket(Packet packet)
              JpcapSender
    最重要的功能,發送數據包。需要注意的是,如果調用這個方法的實例是由JpcapCaptorgetJpcapSenderInstance()得到的話,需要自己設定數據鏈路層的頭,而如果是由上面的openRawSocket()得到的話,那么無需也不能設置,數據鏈路層的頭部將由系統自動生成。

     
    4.Packet
    這個是所有其它數據包類的父類。Jpcap所支持的數據包有:
    ARPPacketDatalinkPacketEthernetPacketICMPPacketIPPacketTCPPacketUDPPacket

    自:http://hzxdark.javaeye.com/blog/35956
    posted on 2007-11-24 23:39 smildlzj 閱讀(250) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 国产亚洲情侣一区二区无| 久久爰www免费人成| 久久精品国产亚洲网站| 91精品免费国产高清在线| 亚洲kkk4444在线观看| 亚洲国产美女精品久久久久∴| 免费观看无遮挡www的小视频| A国产一区二区免费入口| 一区二区亚洲精品精华液| 亚洲国产a∨无码中文777| 综合亚洲伊人午夜网| 成人免费视频一区二区三区| 免费视频成人片在线观看| 一区二区三区在线免费观看视频| 亚洲精品无码少妇30P| 亚洲小视频在线播放| 老司机亚洲精品影院| 亚洲成Av人片乱码色午夜| 久久久久亚洲?V成人无码| 又大又黄又粗又爽的免费视频| 好吊妞视频免费视频| 女人18毛片免费观看| 免费福利网站在线观看| 五月亭亭免费高清在线| 亚洲免费二区三区| 午夜毛片不卡免费观看视频| 最近中文字幕mv免费高清视频7| 久久久久久久91精品免费观看| 日韩视频在线精品视频免费观看 | 99xxoo视频在线永久免费观看| 成人爽a毛片免费| 在线免费观看你懂的| 国产大片线上免费观看| 国产一卡二卡≡卡四卡免费乱码| 亚洲成a人片在线观看国产| 亚洲AV无码一区东京热久久| 亚洲精品视频在线播放| 色妞www精品视频免费看| 久久免费高清视频| 国产精品另类激情久久久免费| 亚洲综合最新无码专区|