我想问一个具体的问题:我正在尝试使用Java 1.7上的jNetPcap 1.4库开发一个软件交换机,目标是要有一个程序,可以转发在端口号上接收到的数据包。 1到端口号2,反之亦然(仅在这两个NIC上)。
我可以看到两个接口上的所有传入数据包,但是在转发时,我遇到了一个问题:如果使用pcap.sendPacket(PcapPacket)
在接口X上发送数据包,则nextPacket()
类中的PcapPacketHandler()
函数将看到它也将要处理的是一个“新”数据包,只是忽略了它,因为它是由同一Pcap
实例发送的。
是否有任何方法可以忽略由pcap.sendPacket(PcapPacket)函数发送的数据包(因此它们不会再次出现在nextPacket()函数中)?
我对底层Winpcap库了解不多,但是我确定C#中的SharpPcap具有这种类型的功能。 jNetPcap也没有吗,或者我缺少什么?
我尝试过的事情:
使用pcap.inject()
代替pcap.sendPacket()
,但是我的NIC却没有
似乎支持此功能
将捕获方向设置为仅使用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());
}
}
第二个接口也是如此。
提前谢谢你的帮助。
最佳答案
我意识到这是一个古老的话题,也许不是那么流行,但是我终于通过添加缓冲区并不断检查重复项来解决了这个问题。由于代码很复杂,因此我决定发布关键功能,以及如何基于jnetpcap.com
建议忽略框架。
代码:
// we're inside the nextPacket(PcapPacket currentPacket, String user) method
buffer.lock();
for(int j = 0; j<buffer.size(); j++){
if(currentPacket.getCaptureHeader().caplen() == buffer.get(j).getCaptureHeader().caplen()
&& packet.size() == buffer.get(j).size()){
buffer.erasePacket(j);
return;
}
}
buffer.unlock();
// continue packet processing
随时在您的项目中使用它。
关于java - jNetPcap sendPacket()函数复制框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22016312/