在抓包或者使用socket,或者监听端口时,如果使用的是pcap4j类库,就会用到网卡信息,那么怎么查看本机的网卡信息呢,Linux的比较方便,直接通过ifconfig
命令就能看到,
windows的比较麻烦一点,因为一般会显示好多个,那么怎么判断是哪一个呢。
首先第一种,就是使用dumpcap.exe -D
命令查看。
这种有时候看不出来,具体数据发送过来,是哪个网卡在接收,那么就要使用代码,看下详细信息。
我用的是这个包。
<dependency>
<groupId>org.pcap4j</groupId>
<artifactId>pcap4j-core</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.pcap4j</groupId>
<artifactId>pcap4j-packetfactory-static</artifactId>
<version>1.7.5</version>
</dependency>
然后如下代码,就能看到每个网卡的详细信息:
try{
List<PcapNetworkInterface> allDevices = Pcaps.findAllDevs();
// 选择一个网络接口
for (PcapNetworkInterface nif : allDevices) {
System.out.println(nif.toString());
System.out.println(nif.getName() + "-------------" + nif.getAddresses().toString());
}
}catch (Exception ex){
ex.printStackTrace();
}
里边能看到每个网卡绑定的IP信息,然后你的数据是发往哪个IP,就去哪个网卡去取,就行
然后再在代码里绑定使用的网卡,就可以监听具体的端口了
PcapHandle handle = null;
try {
//dev就是网卡名
PcapNetworkInterface nif = Pcaps.getDevByName(dev);
//PcapNetworkInterface nif = new NifSelector().selectNetworkInterface();
handle = nif.openLive(snapLen, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, readTimeout);
// 设置过滤器
if (!filter.isEmpty()) {
//filter就是筛选条件,和在wireshark里使用的条件类似,比如udp port 25400
handle.setFilter(filter, BpfProgram.BpfCompileMode.OPTIMIZE);
}
}catch (PcapNativeException e){
logger.error(e.toString(), e);
System.exit(1);
}catch (NotOpenException e){
logger.error(e.toString(), e);
System.exit(1);
}catch (Exception e){
logger.error(e.toString(), e);
}
if(null == handle)
throw new CGnException("Set pcap4j Error, dev=" + dev + ",Fliter=" + filter);
// 观察者模式,抓到报文回调gotPacket方法处理报文内容
//byte[] codes = packet.getRawData(); 这里就能取出端口上发送过来的数据
PacketListener listener = new MyPacketListener(kafkaTemplate, handle, monIdx);
// 直接使用loop无限循环处理包
try {
handle.loop(-1, listener); // COUNT设置为抓包个数,当为-1时无限抓包
} catch (PcapNativeException e) {
logger.error(e.toString(), e);
}
catch (InterruptedException e) {
logger.error(e.toString(), e);
}catch (Exception e){
logger.error(e.toString(), e);
}
handle.close();