我想问你一个具体的问题:我正在尝试使用Java 1.7上的jNetPcap 1.4库开发一个软件交换机,目标是有一个程序,可以转发在端口号上接收到的数据包。1 到端口号。2,反之亦然(仅在这两个 NIC-s 上)。
我可以在两个接口上看到所有传入的数据包,但是在转发时,我有一个问题:如果我在接口 X 上发送一个数据包,类内部pcap.sendPacket(PcapPacket)
的nextPacket()
函数PcapPacketHandler()
也会看到它,并且会处理为“ new”数据包,只是忽略它,因为它是由同一个Pcap
实例发送的。
有什么方法可以忽略 pcap.sendPacket(PcapPacket) 函数发送的数据包(因此它们不会再次出现在 nextPacket() 函数中)?
我对底层的 winpcap 库了解不多,但我确信 C# 中的 SharpPcap 具有这种类型的功能。jNetPcap 也没有,还是我错过了什么?
我尝试过的事情:
- 使用
pcap.inject()
代替pcap.sendPacket()
,但我的网卡似乎不支持这个功能 - 将捕获方向设置为仅入站
pcap.setDirection(Direction.IN)
- 这似乎完全没有效果,数据包被捕获就像设置之前一样。
附言。不幸的是,我必须用 Java 编写它,如果 jNetPcap 库没有此功能,请您建议如何解决该问题?我正在考虑将发送的数据包缓冲到某种类型的数组中,并检查每个新检测到的数据包是否与数组中的一个数据包相同——但这似乎是一个计算复杂的解决方案。
这是我的示例代码(不是全部,只是相关部分):
// Init
Pcap pcap = Pcap.openLive(devices.get(0).getName(), 64*1024, Pcap.MODE_PROMISCUOUS, 1000, errbuf);
...
PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
public void nextPacket(PcapPacket packet, String user) {
// The duplicate packet that is sent in the sendAll() function also appears here
// Process the packet and add it to the forwarding buffer if needed
buffer.addPacket(packet);
}
}
// This is called in a separate thread, if some packets were added to the buffer
public void sendAll(){
while(buffer.hasNext() != 0){
pcap.sendPacket(buffer.getNextPacket());
}
}
第二个界面也是如此。
提前谢谢你的帮助。