簡體   English   中英

jpcap 錯誤發送數據包熟模式

[英]jpcap error sending packets cooked mode

我想使用 jpcap 發送一個 UDP 數據包。

我的代碼是:

    PcapNetworkInterface nif = Pcaps.getDevByName(args[0]); 
    int snapLen = 65536;
    PromiscuousMode mode = PromiscuousMode.NONPROMISCUOUS;
    int timeout = 10000;
    PcapHandle handle = nif.openLive(snapLen, mode, timeout);

    UdpPort srcPort = new UdpPort((short)1002,"");
    UdpPort dstPort = new UdpPort((short)2001, "");;
    short length = (short)12; 
    short checksum = (short)0xABCD; 



    UnknownPacket.Builder unknownb = new UnknownPacket.Builder(); 
    unknownb.rawData(new byte[] { (byte)0, (byte)1, (byte)2, (byte)3 }); 

    UdpPacket.Builder b = new UdpPacket.Builder(); 
    b.dstPort(dstPort) 
     .srcPort(srcPort) 
     .length(length) 
     .checksum(checksum) 
     .correctChecksumAtBuild(false) 
     .correctLengthAtBuild(false) 
     .payloadBuilder(unknownb); 

    EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
    etherBuilder.dstAddr(MacAddress.getByName("FF:FF:FF:FF:FF:FF"))
                .srcAddr(MacAddress.getByName("FF:FF:FF:FF:FF:FF"))
                .type( EtherType.IPV4) // 
                .payloadBuilder(b) 
                .paddingAtBuild(true);


    Packet p = etherBuilder.build(); 


    int i=1;
    while(true) {

        handle.sendPacket(p); 
        System.out.println("send "+i);i++;
        try { 
          Thread.sleep(1000); 
        } catch (InterruptedException e) { 

        } 
    }

執行后,我得到:

org.pcap4j.core.PcapNativeException:pcap_sendpacket() 中發生錯誤:在 org.pcap4j.core.PcapHandle.sendPacket(PcapHandle.java:1242) 的熟模式下不支持發送數據包在 org.pcap4j.core.PcapHandle。發送數據包(PcapHandle.java:1212)

這是 c 實現的鏈接:

https://github.com/frgtn/rpcapd-linux/blob/master/libpcap/pcap-linux.c#L1091

我用過https://gist.github.com/austinmarton/1922600

或其他與 jpcap 一起工作的接口

我肯定遲到了,但我希望這段代碼可以幫助其他人。

import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.packet.*;
import org.pcap4j.packet.namednumber.EtherType;
import org.pcap4j.packet.namednumber.IpNumber;
import org.pcap4j.packet.namednumber.IpVersion;
import org.pcap4j.packet.namednumber.UdpPort;
import org.pcap4j.util.MacAddress;
import org.pcap4j.util.NifSelector;

import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;

public class RAWUDP {

    public static void main(String[] args) throws Exception {
        byte[] pck = "Meow".getBytes();

        UnknownPacket unknownPacket = UnknownPacket.newPacket(pck, 0, pck.length);

        UdpPacket udpPacket = new UdpPacket.Builder()
                .srcAddr(InetAddress.getByName("192.168.1.6"))
                .dstAddr(InetAddress.getByName("192.168.1.6"))
                .srcPort(UdpPort.getInstance((short) 54163))
                .dstPort(UdpPort.getInstance((short) 9110))
                .correctLengthAtBuild(true)
                .correctChecksumAtBuild(true)
                .payloadBuilder(unknownPacket.getBuilder())
                .build();

        IpV4Packet.Builder ipV4Builder = new IpV4Packet.Builder();

        ipV4Builder.version(IpVersion.IPV4)
                .tos(IpV4Rfc791Tos.newInstance((byte) 0))
                .ttl((byte) 100)
                .protocol(IpNumber.UDP)
                .srcAddr((Inet4Address) InetAddress.getByName("192.168.1.6"))
                .dstAddr((Inet4Address) InetAddress.getByName("192.168.1.6"))
                .payloadBuilder(udpPacket.getBuilder())
                .correctChecksumAtBuild(true)
                .correctLengthAtBuild(true);


        PcapNetworkInterface nif;
        try {
            nif = new NifSelector().selectNetworkInterface();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        if (nif == null) {
            return;
        }

        System.out.println(nif.getName() + "(" + nif.getDescription() + ")");

        final PcapHandle handle4send = nif.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 10);

        EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
        etherBuilder.dstAddr(MacAddress.getByName("00:A0:C9:14:C8:29", ":"))
                .srcAddr(MacAddress.getByName("00:A0:C9:14:C8:29", ":"))
                .type(EtherType.IPV4)
                .payloadBuilder(ipV4Builder.build().getBuilder())
                .paddingAtBuild(true);

        Packet p = etherBuilder.build();

        handle4send.sendPacket(p);
    }
}

您發送數據包的設備似乎是程序的參數。

確保它是以太網設備,因為您正在構建以太網數據包。 請注意,“任何”設備不僅不是以太網設備,而且根本不是設備 - 它實際上是“無設備”,這意味着它會在所有設備上偵聽,但不會在任何設備上發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM