[英]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.