2014-02-25 18 views
1

我想问你一个具体的问题:我想发展与jNetPcap 1.4库中的软件交换机上的Java 1.7,我们的目标是有一个程序,它可以转发在端口号上收到的数据包。 1到港口号码2,反之亦然(就在这两个NIC-s上)。jNetPcap了sendpacket()函数复制帧

我可以看到两个接口的所有传入的数据包,但是当涉及到转发,我有一个问题:如果我在接口X发送具有pcap.sendPacket(PcapPacket)PcapPacketHandler()类里面的nextPacket()功能会看到它也,而且会被视为一个“新”数据包,只是忽略它,因为它是由同一个Pcap实例发送的。

有什么办法可以忽略由pcap.sendPacket(PcapPacket)函数发送的数据包(所以它们不会再次出现在nextPacket()函数中)?

我对底层winpcap库了解不多,但我确信C#中的SharpPcap具有此类功能。 jNetPcap是否也有,或者我错过了什么?

事情我已经尝试:

  1. 使用pcap.inject()代替pcap.sendPacket(),但我的网卡不 似乎支持这个功能
  2. 设置捕捉方向只有 pcap.setDirection(Direction.IN)入站 - 这似乎绝对没有 效果,数据包就像设置之前一样被捕获。

Ps。不幸的是,我必须用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()); 
    } 
} 

同去的第二个接口。

非常感谢您的帮助。

回答

0

我意识到这是一个古老的,也许不是那么流行的话题,但我终于通过添加一个缓冲区并不断检查重复项来解决这个问题。由于代码复杂,我决定发布关键功能,并且如何根据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 

随意在你的项目中使用它。