<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>nicky_hk</title>
    <description></description>
    <link>http://nicky-hk.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>关于beehive ：beehive-tools.xml:75: Error running apt compiler </title>
        <author>nicky_hk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicky-hk.javaeye.com">nicky_hk</a>&nbsp;
          链接：<a href="http://nicky-hk.javaeye.com/blog/60344" style="color:red;">http://nicky-hk.javaeye.com/blog/60344</a>&nbsp;
          发表时间: 2007年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我下载了apache-beehive-1.0.2， 打算部署它的netui-blank。<br />我的环境配置是 jdk1.5.0<br /><br />但是每次ant build的时候，都遇到同一个问题：<br />beehive-tools.xml:75: Error running apt compiler<br /><br />我不知道这个所谓的是APT是个什么东西，查看beehive-tools.xml的75行附近，是这样一段代码：<br /> &lt;apt srcdir="@{srcdir}"<br />                 destdir="@{destdir}"<br />                 gendir="@{tempdir}"<br />                 classpathref="_controls.build.classpath"<br />                 compileByExtension="true" <br />                 srcExtensions="*.java,*.jcx,*.jcs,*.jws" <br />                 debug="true"<br />                 nocompile="@{nocompile}"/><br /><br />另外在该文件中，我查到这段代码：<br /> &lt;taskdef name="apt" <br />                     classname="org.apache.beehive.controls.runtime.generator.AptTask" <br />                     classpathref="apt.task.classpath"<br />                     onerror="fail"/><br /><br />我检查了类路径，确认AptTask存在。<br />我现在相当困惑，不知道如何才能build成功，或者说如果使用beehive<br /><br />请有相关经验的工程师指点一二，谢谢！
          <br/>
          <span style="color:red;">
            <a href="http://nicky-hk.javaeye.com/blog/60344#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Mar 2007 14:31:09 +0800</pubDate>
        <link>http://nicky-hk.javaeye.com/blog/60344</link>
        <guid>http://nicky-hk.javaeye.com/blog/60344</guid>
      </item>
      <item>
        <title>转一个兄弟的文章：JPCAP</title>
        <author>nicky_hk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicky-hk.javaeye.com">nicky_hk</a>&nbsp;
          链接：<a href="http://nicky-hk.javaeye.com/blog/46719" style="color:red;">http://nicky-hk.javaeye.com/blog/46719</a>&nbsp;
          发表时间: 2007年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div align="center"><strong><span style="FONT-SIZE: 14pt">JPCAP</span></strong><strong><span style="FONT-SIZE: 14pt">&mdash;&mdash;</span></strong><strong><span style="FONT-SIZE: 14pt">JAVA</span></strong><strong><span style="FONT-SIZE: 14pt">中的数据链路层控制</span></strong></div>
<div align="center"><strong><span style="FONT-SIZE: 9pt"></span></strong></div>
<div><strong>&nbsp;</strong></div>
<div><strong>一．</strong><strong>JPCAP</strong><strong>简介</strong></div>
<div style="TEXT-INDENT: 21pt">众所周知，JAVA语言虽然在TCP/UDP传输方面给予了良好的定义，但对于网络层以下的控制，却是无能为力的。JPCAP扩展包弥补了这一点。</div>
<div style="TEXT-INDENT: 21pt">JPCAP实际上并非一个真正去实现对数据链路层的控制，而是一个中间件，JPCAP调用wincap/libpcap，而给JAVA语言提供一个公共的接口，从而实现了平台无关性。在官方网站上声明，JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。</div>
<div><strong>二．</strong><strong>JPCAP</strong><strong>机制</strong></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JPCAP</span>的整个结构大体上跟wincap/libpcap是很相像的，例如NetworkInterface类对应wincap<span style="COLOR: black">的</span><span style="COLOR: black">typedef struct _ADAPTER&nbsp;&nbsp;ADAPTER</span><span style="COLOR: black">，</span><span style="COLOR: black">getDeviceList()</span><span style="COLOR: black">对应</span>pcap_findalldevs()等等。<span> JPCAP有16个类，下面就其中最重要的4个类做说明。</span></div>
<div style="MARGIN-LEFT: 21pt"><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>1．</span></strong><strong>NetworkInterface</strong></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt">该类的每一个实例代表一个网络设备，一般就是网卡。这个类只有一些数据成员，除了继承自java.lang.Object的基本方法以外，没有定义其它方法。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt"><strong>&nbsp;</strong></div>
<table cellspacing="0" border="1" width="100%" cellpadding="0" style="WIDTH: 100%">
    <tbody>
        <tr>
            <td colspan="2" width="100%" style="BORDER-RIGHT: #aca899 1pt inset; PADDING-RIGHT: 2.25pt; BORDER-TOP: 1pt inset; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: 1pt inset; WIDTH: 100%; PADDING-TOP: 2.25pt; BORDER-BOTTOM: 1pt inset">
            <div><strong><span style="FONT-SIZE: 9pt">数据成员</span></strong></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">NetworkInterfaceAddress[]</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">addresses</span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">这个接口的网络地址。设定为数组应该是考虑到有些设备同时连接多条线路，例如路由器。但我们的PC机的网卡一般只有一条线路，所以我们一般取addresses[0]就够了。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;java.lang.String</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">datalink_description</span></strong><span style="FONT-SIZE: 9pt">.</span></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">数据链路层的描述。描述所在的局域网是什么网。例如，以太网（Ethernet）、无线LAN网（wireless LAN）、令牌环网(token ring)等等。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;java.lang.String</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">datalink_name </span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">该网络设备所对应数据链路层的名称。具体来说，例如Ethernet10M、<span>100M、1000M等等。</span></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;java.lang.String</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">description</span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">网卡是XXXX牌子XXXX型号之类的描述。例如我的网卡描述：Realtek RTL8169/8110 Family Gigabit Ethernet NIC </span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;boolean</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">Loopback</span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">标志这个设备是否loopback设备。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;byte[]</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">mac_address</span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">网卡的MAC地址，6个字节。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.12%; PADDING-TOP: 2.25pt">
            <div align="right"><span style="FONT-SIZE: 9pt">&nbsp;java.lang.String</span></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.88%; PADDING-TOP: 2.25pt">
            <div align="left"><strong><span style="FONT-SIZE: 9pt">Name</span></strong></div>
            <div align="left"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">这个设备的名称。例如我的网卡名称：\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}</span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="MARGIN-LEFT: 21pt"><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>2．</span></strong><strong>JpcapCaptor</strong></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt">该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接，可以通过该类的实例来控制设备，例如设定网卡模式、设定过滤关键字等等。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt">&nbsp;</div>
<table cellspacing="0" border="1" width="100%" cellpadding="0" style="WIDTH: 100%">
    <tbody>
        <tr>
            <td valign="top" colspan="2" width="100%" style="BORDER-RIGHT: #aca899 1pt inset; PADDING-RIGHT: 2.25pt; BORDER-TOP: 1pt inset; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: 1pt inset; WIDTH: 100%; PADDING-TOP: 2.25pt; BORDER-BOTTOM: 1pt inset">
            <div><code><strong><span style="FONT-SIZE: 9pt">数据成员</span></strong></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">dropped_packets&nbsp;</span></strong></code></div>
            <div style="TEXT-INDENT: 17.65pt"><span style="FONT-SIZE: 9pt">抛弃的包的数目。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">protected &nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">ID</span></strong></code></div>
            <div><code><strong><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; </span></strong></code><span style="FONT-SIZE: 9pt">这个数据成员在官方文档中并没有做任何说明，查看</span><span style="FONT-SIZE: 9pt">JPCAP</span><span style="FONT-SIZE: 9pt">源代码可以发现这个</span><span style="FONT-SIZE: 9pt">ID</span><span style="FONT-SIZE: 9pt">实际上在其</span><span style="FONT-SIZE: 9pt">JNI</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">C</span><span style="FONT-SIZE: 9pt">代码部分传进来的，这类本身并没有做出定义，所以是供其内部使用的。实际上在对</span><span style="FONT-SIZE: 9pt">JpcapCator</span><span style="FONT-SIZE: 9pt">实例的使用中也没有办法调用此数据成员。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">protected static&nbsp;boolean[]</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">instanciatedFlag</span></strong></code></div>
            <div><span>&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">同样在官方文档中没有做任何说明，估计其为供内部使用。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">protected static&nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">MAX_NUMBER_OF_INSTANCE</span></strong></code></div>
            <div style="TEXT-INDENT: 17.65pt"><span style="FONT-SIZE: 9pt">同样在官方文档中没有做任何说明，估计其为供内部使用。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">received_packets</span></strong></code><span style="FONT-SIZE: 9pt"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">收到的包的数目</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" colspan="2" width="100%" style="BORDER-RIGHT: #aca899 1pt inset; PADDING-RIGHT: 2.25pt; BORDER-TOP: 1pt inset; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: 1pt inset; WIDTH: 100%; PADDING-TOP: 2.25pt; BORDER-BOTTOM: 1pt inset">
            <div><code><strong><span style="FONT-SIZE: 9pt">方法成员</span></strong></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">static&nbsp;NetworkInterface[]</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">getDeviceList</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">返回一个网络设备列表。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">static&nbsp;JpcapCaptor</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">openDevice</span></strong></code><code><span style="FONT-SIZE: 9pt">(NetworkInterface interface, int&nbsp;snaplen, boolean&nbsp;promisc, int&nbsp;to_ms)</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">创建一个与指定设备的连接并返回该连接。注意，以上两个方法都是静态方法。</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interface</span><span style="FONT-SIZE: 9pt">：要打开连接的设备的实例；</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Snaplen</span><span style="FONT-SIZE: 9pt">：这个是比较容易搞混的一个参数。其实这个参数不是限制只能捕捉多少数据包，而是限制每一次收到一个数据包，只提取该数据包中前多少字节；</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Promisc</span><span style="FONT-SIZE: 9pt">：设置是否混杂模式。处于混杂模式将接收所有数据包，若之后又调用了包过滤函数</span><span style="FONT-SIZE: 9pt">setFilter()</span><span style="FONT-SIZE: 9pt">将不起任何作用；</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; To_ms</span><span style="FONT-SIZE: 9pt">：这个参数主要用于</span><span style="FONT-SIZE: 9pt">processPacket()</span><span style="FONT-SIZE: 9pt">方法，指定超时的时间；</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">Close</span></strong></code>()<span style="FONT-SIZE: 9pt"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">关闭调用该方法的设备的连接，相对于</span><span style="FONT-SIZE: 9pt">openDivece()</span><span style="FONT-SIZE: 9pt">打开连接。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;JpcapSender</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">getJpcapSenderInstance</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">该返回一个</span><span style="FONT-SIZE: 9pt">JpcapSender</span><span style="FONT-SIZE: 9pt">实例，</span><span style="FONT-SIZE: 9pt">JpcapSender</span><span style="FONT-SIZE: 9pt">类是专门用于控制设备的发送数据包的功能的类。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;Packet</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">getPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">捕捉并返回一个数据包。这是</span><span style="FONT-SIZE: 9pt">JpcapCaptor</span><span style="FONT-SIZE: 9pt">实例中四种捕捉包的方法之一。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">loopPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">(int&nbsp;count, PacketReceiver handler)</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">捕捉指定数目的数据包，并交由实现了</span><span style="FONT-SIZE: 9pt">PacketReceiver</span><span style="FONT-SIZE: 9pt">接口的类的实例处理，并返回捕捉到的数据包数目。如果</span><span style="FONT-SIZE: 9pt">count</span><span style="FONT-SIZE: 9pt">参数设为－</span><span style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt">，那么无限循环地捕捉数据。</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">这个方法不受超时的影响。还记得</span><span style="FONT-SIZE: 9pt">openDivice()</span><span style="FONT-SIZE: 9pt">中的</span><span style="FONT-SIZE: 9pt">to_ms</span><span style="FONT-SIZE: 9pt">参数么？那个参数对这个方法没有影响，如果没有捕捉到指定数目数据包，那么这个方法将一直阻塞等待。</span></div>
            <div style="TEXT-INDENT: 27pt"><span style="FONT-SIZE: 9pt">PacketReceiver</span><span style="FONT-SIZE: 9pt">中只有一个抽象方法</span><span style="FONT-SIZE: 9pt">void receive(Packet p)</span><span style="FONT-SIZE: 9pt">。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">processPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">(int&nbsp;count, PacketReceiver handler)</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">跟</span><code><strong><span style="FONT-SIZE: 9pt">loopPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><code><span style="FONT-SIZE: 9pt">功能一样，唯一的区别是这个方法受超时的影响，超过指定时间自动返回捕捉到数据包的数目。</span></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;int</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">dispatchPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">(int&nbsp;count, PacketReceiver&nbsp;handler)</span></code><span style="FONT-SIZE: 9pt"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt">跟</span><code><strong><span style="FONT-SIZE: 9pt">processPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><code><span style="FONT-SIZE: 9pt">功能一样，区别是这个方法可以处于&ldquo;non-blocking&rdquo;模式工作，在这种模式下dispatchPacket()可能立即返回，即使没有捕捉到任何数据包。</span></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">setFilter</span></strong></code><code><span style="FONT-SIZE: 9pt">(java.lang.String&nbsp;condition, boolean&nbsp;optimize)</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><code><span style="FONT-SIZE: 9pt">condition</span></code><code><span style="FONT-SIZE: 9pt">：</span></code><span style="FONT-SIZE: 9pt">设定要提取的包的关键字。</span></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><code><span style="FONT-SIZE: 9pt">Optimize</span></code><code><span style="FONT-SIZE: 9pt">：这个参数在说明文档以及源代码中都没有说明，只是说这个参数如果为真，那么过滤器将处于优化模式。</span></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">setNonBlockingMode</span></strong></code><code><span style="FONT-SIZE: 9pt">(boolean&nbsp;nonblocking)</span></code></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">如果值为&ldquo;</span><span style="FONT-SIZE: 9pt">true</span><span style="FONT-SIZE: 9pt">&rdquo;，那么设定为&ldquo;</span><span style="FONT-SIZE: 9pt">non-blocking</span><span style="FONT-SIZE: 9pt">&rdquo;模式。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="28%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 28.48%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td width="71%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 71.52%; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">breakLoop</span></strong></code>()</div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">当调用</span><span style="FONT-SIZE: 9pt">processPacket()</span><span style="FONT-SIZE: 9pt">和</span><span style="FONT-SIZE: 9pt">loopPacket()</span><span style="FONT-SIZE: 9pt">后，再调用这个方法可以强制让</span><span style="FONT-SIZE: 9pt">processPacket()</span><span style="FONT-SIZE: 9pt">和</span><span style="FONT-SIZE: 9pt">loopPacket()</span><span style="FONT-SIZE: 9pt">停止。</span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="MARGIN-LEFT: 21pt"><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>3．</span></strong><strong>JpcapSender</strong></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt">该类专门用于控制数据包的发送。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 18pt">&nbsp;</div>
<table cellspacing="0" border="1" width="100%" cellpadding="0" style="WIDTH: 100%">
    <tbody>
        <tr>
            <td valign="top" colspan="2" width="100%" style="BORDER-RIGHT: #aca899 1pt inset; PADDING-RIGHT: 2.25pt; BORDER-TOP: 1pt inset; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: 1pt inset; WIDTH: 100%; PADDING-TOP: 2.25pt; BORDER-BOTTOM: 1pt inset">
            <div><code><strong><span style="FONT-SIZE: 9pt">方法成员</span></strong></code></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="19%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 19.7%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">close</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">强制关闭这个连接。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="19%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 19.7%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">static&nbsp;JpcapSender</span></code></div>
            </td>
            <td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">openRawSocket</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code></div>
            <div><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">这个方法返回的</span><span style="FONT-SIZE: 9pt">JpcapSender</span><span style="FONT-SIZE: 9pt">实例发送数据包时将自动填写数据链路层头部分。</span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="19%" style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; WIDTH: 19.7%; PADDING-TOP: 2.25pt">
            <div align="right"><code><span style="FONT-SIZE: 9pt">&nbsp;void</span></code></div>
            </td>
            <td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
            <div><code><strong><span style="FONT-SIZE: 9pt">sendPacket</span></strong></code><code><span style="FONT-SIZE: 9pt">(Packet packet)</span></code><span style="FONT-SIZE: 9pt"> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JpcapSender</span><span style="FONT-SIZE: 9pt">最重要的功能，发送数据包。需要注意的是，如果调用这个方法的实例是由</span><strong><span style="FONT-SIZE: 9pt">JpcapCaptor</span></strong><span style="FONT-SIZE: 9pt">的</span><code><strong><span style="FONT-SIZE: 9pt">getJpcapSenderInstance</span></strong></code><code><span style="FONT-SIZE: 9pt">()</span></code><code><span style="FONT-SIZE: 9pt">得到的话，需要自己设定数据链路层的头，而如果是由上面的<strong>openRawSocket</strong>()</span></code><span style="FONT-SIZE: 9pt">得到的话，那么无需也不能设置，数据链路层的头部将由系统自动生成。</span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="MARGIN-LEFT: 21pt"><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>4．</span></strong><strong>Packet</strong></div>
<div style="MARGIN-LEFT: 39pt">这个是所有其它数据包类的父类。Jpcap所支持的数据包有：<br />
<span style="FONT-SIZE: 9pt">ARPPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">DatalinkPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">EthernetPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">ICMPPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">IPPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">TCPPacket</span><span style="FONT-SIZE: 9pt">、</span><span style="FONT-SIZE: 9pt">UDPPacket</span></div>
<div style="MARGIN-LEFT: 39pt">&nbsp;</div>
<div><strong>三．使用JPCAP</strong><strong>实现监听</strong></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>1</strong></span><strong>．监听原理</strong></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在详细说用JPCAP实现网络监听实现前，先简单介绍下监听的原理。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>局域网监听利用的是所谓的&ldquo;ARP欺骗&rdquo;技术。在以前曾经一段阶段，局域网的布局是使用总线式（或集线式）结构，要到达监听只需要将网卡设定为混杂模式即可，但现在的局域网络普遍采用的是交换式网络，所以单纯靠混杂模式来达到监听的方法已经不可行了。所以为了达到监听的目的，我们需要&ldquo;欺骗&rdquo;路由器、&ldquo;欺骗&rdquo;交换机，即&ldquo;ARP欺骗&rdquo;技术。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>假设本机为A，监听目标为B。</div>
<div style="TEXT-INDENT: 21pt">首先，伪造一个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的机器上来了。</div>
<div style="TEXT-INDENT: 21pt">接着，再伪造一个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。</div>
<div style="TEXT-INDENT: 21pt">这样还只是拦截了B的数据包而已，B并不能上网&mdash;&mdash;解决方法是将接收到的包，除了目的地址部分稍做修改，其它原封不动的再转发出去，这样就达到了监听的目的&mdash;&mdash;在B不知不觉中浏览了B所有的对外数据包。</div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div align="center"><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">数据包解析</span></div>
<div><span style="FONT-SIZE: 9pt">单元：</span><span style="FONT-SIZE: 9pt">Byte</span></div>
<table cellspacing="0" border="1" cellpadding="0" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse">
    <tbody>
        <tr style="HEIGHT: 22.1pt">
            <td valign="top" colspan="3" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">Ethernet</span><span style="FONT-SIZE: 9pt">头部</span></div>
            </td>
            <td valign="top" colspan="8" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">数据部分</span></div>
            </td>
        </tr>
        <tr style="HEIGHT: 22.1pt">
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">６</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">６</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">２</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">2</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">2</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">2</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">2</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">４</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">６</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">４</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 22.1pt">
            <div><span style="FONT-SIZE: 9pt">６</span></div>
            </td>
        </tr>
        <tr style="HEIGHT: 62.45pt">
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">目标</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">源地</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">类型号</span><span style="FONT-SIZE: 9pt">0x0800:ip</span></div>
            <div><span style="FONT-SIZE: 9pt">0x0806:ARP</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">局域网类型</span></div>
            <div><span style="FONT-SIZE: 9pt">以太网</span><span style="FONT-SIZE: 9pt">0x0001</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">网络协议类型</span></div>
            <div><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">网络</span><span style="FONT-SIZE: 9pt">0x0800</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">MAC/IP</span><span style="FONT-SIZE: 9pt">地址长度，恒为</span><span style="FONT-SIZE: 9pt">0x06/04</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">包类型</span></div>
            <div><span style="FONT-SIZE: 9pt">REPLY</span></div>
            <div><span style="FONT-SIZE: 9pt">0x0002</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">目标</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">目标</span><span style="FONT-SIZE: 9pt">MAC </span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">源</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
            <td valign="top" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 62.45pt">
            <div><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">源</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div style="TEXT-INDENT: 21pt"><strong>2</strong><strong>．用JPCAP</strong><strong>实现监听</strong></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>就如上面说的，为了实现监听，我们必须做四件事：</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>A．</span>发送ARP包修改B的ARP缓存表；</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>B．</span>发送ARP包修改路由ARP缓存表；</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>C．</span>转发B发过来的数据包；</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>D．</span>转发路由发过来的数据包；</div>
<div style="MARGIN-LEFT: 21pt">&nbsp;</div>
<div style="TEXT-INDENT: 17.95pt">下面我们给个小小的例子说明怎样实现。</div>
<div style="TEXT-INDENT: 17.95pt">我们假定运行这个程序的机器A只有一个网卡，只接一个网络，所在局域网为Ethernet，并且假定已经通过某种方式获得B和网关的MAC地址（例如ARP解析获得）。我们修改了B和网关的ARP表，并对他们的包进行了转发。</div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">public class changeARP{</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private NetworkInterface[] devices;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">设备列表</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private NetworkInterface device;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">要使用的设备</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private JpcapCaptor jpcap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">与设备的连接</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private JpcapSender sender;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">用于发送的实例</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private byte[] targetMAC, gateMAC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址，网关的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private byte[] String targetIp, String gateIp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址，网关的</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</span><span style="FONT-SIZE: 9pt">初始化设备</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * JpcapCaptor.getDeviceList()</span><span style="FONT-SIZE: 9pt">得到设备可能会有两个，其中一个必定是&ldquo;</span><span style="FONT-SIZE: 9pt; BACKGROUND: white; COLOR: blue">Generic </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt; COLOR: blue">*<span style="BACKGROUND: white">dialup adapter</span></span><span style="FONT-SIZE: 9pt; COLOR: blue">&rdquo;，</span><span style="FONT-SIZE: 9pt">这是</span><span style="FONT-SIZE: 9pt">windows</span><span style="FONT-SIZE: 9pt">系统的虚拟网卡，并非真正的硬件设备。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt">*</span><span style="FONT-SIZE: 9pt">注意：在这里有一个小小的</span><span style="FONT-SIZE: 9pt">BUG</span><span style="FONT-SIZE: 9pt">，如果</span><span style="FONT-SIZE: 9pt">JpcapCaptor.getDeviceList()</span><span style="FONT-SIZE: 9pt">之前有类似</span><span style="FONT-SIZE: 9pt">JFrame jf=new</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt">*JFame</span><span style="FONT-SIZE: 9pt">（）这类的语句会影响得到设备个数，只会得到真正的硬件设备，而不会出现虚拟网卡。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt">*</span><span style="FONT-SIZE: 9pt">虚拟网卡只有</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址而没有</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址，而且如果出现虚拟网卡，那么实际网卡的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">将分</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt">*</span><span style="FONT-SIZE: 9pt">配给虚拟网卡，也就是说在程序中调用</span><span style="FONT-SIZE: 9pt">device.</span> <span style="FONT-SIZE: 9pt">mac_address</span><span style="FONT-SIZE: 9pt">时得到的是</span><span style="FONT-SIZE: 9pt">00 00 00 00 00 00</span><span style="FONT-SIZE: 9pt">。</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private NetworkInterface getDevice() throws IOException {</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; devices = JpcapCaptor.getDeviceList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">获得设备列表</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; device = devices[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">只有一个设备</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">打开与设备的连接</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jpcap.setFilter(&ldquo;ip&rdquo;,true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">只监听</span><span style="FONT-SIZE: 9pt">B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">数据包</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender = captor.getJpcapSenderInstance();</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</span><span style="FONT-SIZE: 9pt">修改</span><span style="FONT-SIZE: 9pt">B</span><span style="FONT-SIZE: 9pt">和网关的</span><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">表。因为网关会定时发数据包刷新自己和</span><span style="FONT-SIZE: 9pt">B</span><span style="FONT-SIZE: 9pt">的缓存表，所以必须每隔一</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</span><span style="FONT-SIZE: 9pt">段时间就发一次包重新更改</span><span style="FONT-SIZE: 9pt">B</span><span style="FONT-SIZE: 9pt">和网关的</span><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">表。</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@</span><span style="FONT-SIZE: 9pt">参数</span><span style="FONT-SIZE: 9pt"> targetMAC &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址，可通过</span><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">解析得到；</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@</span><span style="FONT-SIZE: 9pt">参数</span><span style="FONT-SIZE: 9pt"> targetIp &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">地址；</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@</span><span style="FONT-SIZE: 9pt">参数</span><span style="FONT-SIZE: 9pt"> gateMAC &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">网关的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址；</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@</span><span style="FONT-SIZE: 9pt">参数</span><span style="FONT-SIZE: 9pt"> gateIp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt">网关的</span><span style="FONT-SIZE: 9pt">IP;</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public changeARP(byte[] targetMAC, String targetIp,byte[] gateMAC, String gateIp)</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws UnknownHostException,InterruptedException {</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this. targetMAC = &nbsp;targetMAC;</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this. targetIp = &nbsp;targetIp;</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this. gateMAC = gateMAC;</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this. gateIp = gateIp;</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getDevice();</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget = new ARPPacket();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">修改</span><span style="FONT-SIZE: 9pt">B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">表的</span><span style="FONT-SIZE: 9pt">ARP</span><span style="FONT-SIZE: 9pt">包</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">选择以太网类型</span><span style="FONT-SIZE: 9pt">(Ethernet)</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.prototype = ARPPacket.PROTOTYPE_IP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">选择</span><span style="FONT-SIZE: 9pt">IP</span><span style="FONT-SIZE: 9pt">网络协议类型</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.operation = ARPPacket.ARP_REPLY;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">选择</span><span style="FONT-SIZE: 9pt">REPLY</span><span style="FONT-SIZE: 9pt">类型</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.hlen = 6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //MAC</span><span style="FONT-SIZE: 9pt">地址长度固定</span><span style="FONT-SIZE: 9pt">6</span><span style="FONT-SIZE: 9pt">个字节</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.plen = 4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IP</span><span style="FONT-SIZE: 9pt">地址长度固定</span><span style="FONT-SIZE: 9pt">4</span><span style="FONT-SIZE: 9pt">个字节</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.sender_hardaddr = device.mac_address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //A</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.sender_protoaddr = InetAddress.getByName(gateIp).getAddress();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="FONT-SIZE: 9pt">网关</span><span style="FONT-SIZE: 9pt">IP</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arpTarget.target_hardaddr = targetMAC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //B</span><span style="FONT-SIZE: 9pt">的</span><span style="FONT-SIZE: 9pt">MAC</span><span style="FONT-SIZE: 9pt">地址</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbs</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://nicky-hk.javaeye.com/blog/46719#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Jan 2007 17:10:14 +0800</pubDate>
        <link>http://nicky-hk.javaeye.com/blog/46719</link>
        <guid>http://nicky-hk.javaeye.com/blog/46719</guid>
      </item>
  </channel>
</rss>