Pcap4j 库:线程异常 "main" java.io.IOException:没有要捕获的 NIF
Pcap4j Library: Exception in thread "main" java.io.IOException: No NIF to capture
当我捕获数据包时,出现以下错误:
Exception in thread "main" java.io.IOException: No NIF to capture.
at org.pcap4j.util.NifSelector.selectNetworkInterface(NifSelector.java:44)
at io.bigdatalabs.pcaptest.App.main(App.java:22)
密码是:
package io.bigdatalabs.pcaptest;
import java.io.IOException;
import org.pcap4j.core.BpfProgram.BpfCompileMode;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.PcapNetworkInterface.PromiscuousMode;
import org.pcap4j.packet.Packet;
import org.pcap4j.util.NifSelector;
public class App {
public static void main(String [] args) throws PcapNativeException, IOException, NotOpenException, InterruptedException {
String filter = null;
if (args.length != 0) {
filter = args[0];
}
PcapNetworkInterface nif = new NifSelector().selectNetworkInterface();
if (nif == null) {
System.exit(1);
}
final PcapHandle handle = nif.openLive(65536, PromiscuousMode.PROMISCUOUS, 10);
if (filter != null && filter.length() != 0) {
handle.setFilter(filter, BpfCompileMode.OPTIMIZE);
}
PacketListener listener = new PacketListener() {
@Override
public void gotPacket(Packet packet) {
printPacket(packet, handle);
}
};
handle.loop(5, listener);
}
private static void printPacket(Packet packet, PcapHandle ph) {
StringBuilder sb = new StringBuilder();
sb.append("A packet captured at ")
.append(ph.getTimestamp())
.append(":");
System.out.println(sb);
System.out.println(packet);
}
}
但是我运行这段代码用sudo命令,是运行ning。为什么我不 运行 没有 sudo 的代码?我应该 运行 这个代码没有 sudo。我怎样才能 运行 这个代码?
为了列出和监控您的网络接口,您需要超级用户权限。这就是为什么当您 运行 没有 sudo 的代码时无法列出任何接口并得到异常。
如果你不使用 sudo 运行,即使是著名的 WireShark 也无法列出你的接口,所以我认为你不会有任何其他解决方案 运行 你的具有普通权限的应用程序。
祝你好运。
当我捕获数据包时,出现以下错误:
Exception in thread "main" java.io.IOException: No NIF to capture.
at org.pcap4j.util.NifSelector.selectNetworkInterface(NifSelector.java:44) at io.bigdatalabs.pcaptest.App.main(App.java:22)
密码是:
package io.bigdatalabs.pcaptest;
import java.io.IOException;
import org.pcap4j.core.BpfProgram.BpfCompileMode;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.PcapNetworkInterface.PromiscuousMode;
import org.pcap4j.packet.Packet;
import org.pcap4j.util.NifSelector;
public class App {
public static void main(String [] args) throws PcapNativeException, IOException, NotOpenException, InterruptedException {
String filter = null;
if (args.length != 0) {
filter = args[0];
}
PcapNetworkInterface nif = new NifSelector().selectNetworkInterface();
if (nif == null) {
System.exit(1);
}
final PcapHandle handle = nif.openLive(65536, PromiscuousMode.PROMISCUOUS, 10);
if (filter != null && filter.length() != 0) {
handle.setFilter(filter, BpfCompileMode.OPTIMIZE);
}
PacketListener listener = new PacketListener() {
@Override
public void gotPacket(Packet packet) {
printPacket(packet, handle);
}
};
handle.loop(5, listener);
}
private static void printPacket(Packet packet, PcapHandle ph) {
StringBuilder sb = new StringBuilder();
sb.append("A packet captured at ")
.append(ph.getTimestamp())
.append(":");
System.out.println(sb);
System.out.println(packet);
}
}
但是我运行这段代码用sudo命令,是运行ning。为什么我不 运行 没有 sudo 的代码?我应该 运行 这个代码没有 sudo。我怎样才能 运行 这个代码?
为了列出和监控您的网络接口,您需要超级用户权限。这就是为什么当您 运行 没有 sudo 的代码时无法列出任何接口并得到异常。
如果你不使用 sudo 运行,即使是著名的 WireShark 也无法列出你的接口,所以我认为你不会有任何其他解决方案 运行 你的具有普通权限的应用程序。
祝你好运。