jNetPcap sendPacket()函数复制框架

时间:2014-02-25 13:56:43

标签: java libpcap winpcap jnetpcap

我想问你一个具体问题:我正在尝试使用 Java 1.7 上的 jNetPcap 1.4 库开发软件开关,目标是一个程序,可以转发端口号上收到的数据包。 1到港口号。 2,反之亦然(仅在这两个NIC-s上)。

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

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

我对底层的winpcap库知之甚少,但我确信C#中的SharpPcap具有这种功能。 jNetPcap也没有它,或者我错过了什么?

我尝试过的事情:

  1. 使用pcap.inject()代替pcap.sendPacket(),但我的NIC没有 似乎支持这个功能
  2. 仅将捕获方向设置为入站 pcap.setDirection(Direction.IN) - 这似乎绝对没有 效果,就像在设置之前捕获数据包一样。
  3. 聚苯乙烯。不幸的是我必须用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());
        } 
    }
    

    第二个界面也一样。

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我意识到这是一个旧的,也许不是那么热门的话题,但我终于通过添加缓冲区并不断检查重复来解决这个问题。由于代码很复杂,我决定发布关键功能,如何根据// 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 建议忽略框架。

代码:

$("#id").click(function(){
    var $x = $("#id");
    $x.removeProp("-webkit-animation");
});

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