備注學(xué)院

          LuLu

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評(píng)論 :: 0 Trackbacks

           半年前網(wǎng)絡(luò)技術(shù)課的老師要我們做個(gè)ARP查詢,老師是教人用winsock的,可我一味鉆java,干著急,鉆進(jìn)java世界到處查,終于找到這么一個(gè)東西。

          然后做了一個(gè)ARP監(jiān)聽器,沒(méi)想到被老師看上了,說(shuō)是國(guó)內(nèi)JPCAP研究的人不多,可以考慮寫一篇論文,老師給我推薦發(fā)表。

          于是有了這么一篇東西。不過(guò)現(xiàn)在還不知道老師發(fā)哪個(gè)刊物去了。。。老師說(shuō),還沒(méi)回音。。

           注:由于字?jǐn)?shù)限制,分成2部分發(fā)。

           

           

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

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

           
          2.JpcapCaptor
          該類提供了一系列靜態(tài)方法實(shí)現(xiàn)一些基本的功能。該類一個(gè)實(shí)例代表建立了一個(gè)與指定設(shè)備的鏈接,可以通過(guò)該類的實(shí)例來(lái)控制設(shè)備,例如設(shè)定網(wǎng)卡模式、設(shè)定過(guò)濾關(guān)鍵字等等。
           

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

           
          3.JpcapSender
          該類專門用于控制數(shù)據(jù)包的發(fā)送。
           

          方法成員
           void
          close()
                   
          強(qiáng)制關(guān)閉這個(gè)連接。
          static JpcapSender
          openRawSocket()
               這個(gè)方法返回的JpcapSender實(shí)例發(fā)送數(shù)據(jù)包時(shí)將自動(dòng)填寫數(shù)據(jù)鏈路層頭部分。
           void
          sendPacket(Packet packet)
                    JpcapSender
          最重要的功能,發(fā)送數(shù)據(jù)包。需要注意的是,如果調(diào)用這個(gè)方法的實(shí)例是由JpcapCaptorgetJpcapSenderInstance()得到的話,需要自己設(shè)定數(shù)據(jù)鏈路層的頭,而如果是由上面的openRawSocket()得到的話,那么無(wú)需也不能設(shè)置,數(shù)據(jù)鏈路層的頭部將由系統(tǒng)自動(dòng)生成。

           
          4.Packet
          這個(gè)是所有其它數(shù)據(jù)包類的父類。Jpcap所支持的數(shù)據(jù)包有:
          ARPPacketDatalinkPacketEthernetPacketICMPPacketIPPacketTCPPacketUDPPacket

          自:http://hzxdark.javaeye.com/blog/35956
          posted on 2007-11-24 23:39 smildlzj 閱讀(242) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 岳阳县| 阜宁县| 日喀则市| 长顺县| 普兰店市| 林州市| 隆回县| 河西区| 磴口县| 石林| 柳江县| 泉州市| 延吉市| 沙河市| 胶南市| 丰台区| 自贡市| 樟树市| 保定市| 宿松县| 纳雍县| 博野县| 贵港市| 白河县| 棋牌| 丹阳市| 荆州市| 丹巴县| 吉林市| 莆田市| 杂多县| 宜兰县| 宁国市| 准格尔旗| 东乡县| 翁牛特旗| 临潭县| 弥渡县| 来宾市| 新绛县| 互助|