Таким образом, для конкретной задачи, я попросил, чтобы найти и распечатать запросUDP пакеты Анализ
и ответ (для полого протокола)
для захваченного UDP DNS пакетов.
Теперь я очень новичок в программировании сети, и я попытался достичь этого, используя JNetPcap Library. Однако, обратите внимание, что вопрос не о JNetPcap функции.
Образцовые выходы, которые я получаю от своей программы (которая может быть изменена), - это вид.
Got UDP Packet
Name of packet :Udp
The Source :14786
The Destination :53
The Legnth of packet :8
Got UDP Packet
Name of packet :Udp
The Source :58186
The Destination :53
The Legnth of packet :8
Так , что являетсяrequest and response
здесь? Если мой вывод неполный, какие поля мне нужно распечатать, чтобы получить запрос и ответ?
Редактировать: Я не нюхаю какого-либо конкретного приложения. Меня попросят обнюхать сеть (как в, запустить в вашем программном обеспечении на нашей машине, и все это) в целом и найти запрос и ответ. Спасибо.
Дополнительная информация, которая может быть актуальным:
Таким образом, чтобы фильтровать DNS пакеты UDP Я использую этот код (код может не потребоваться для вопроса, но я включаю его на всякий случай что-то не так):
PcapBpfProgram program = new PcapBpfProgram();
String expression = "udp dst port 53";
int optimize = 0; // 0 = false
int netmask = 0xFFFFFF00; // 255.255.255.0
if (pcap.compile(program, expression, optimize, netmask) != Pcap.OK) {
System.err.println(pcap.getErr());
return;
}
Здесь я анализирую первые 10 пакетов, а именно:
// Receive packet from the loop
PcapPacketHandler<String> jpacketHandler = packet_handler();
// capture first 10 packages
pcap.loop(10, jpacketHandler, "");
И это, как я печатаю пример вывода приведенный выше:
public static PcapPacketHandler<String> packet_handler() {
PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
Udp udp = new Udp();
@Override
public void nextPacket(PcapPacket packet, String user) {
// Another check to determine if packet is UDP.
if (!packet.hasHeader(udp)) {
// not UDP? skip
}
// Yet another check to determine if packet is UDP.
if (packet.hasHeader(udp)) {
System.out.println("Got UDP Packet");
System.out.println("Name of packet :" + packet.getHeader(udp).getName());
System.out.println("The Source :" + packet.getHeader(udp).source());
System.out.println("The Destination :" + packet.getHeader(udp).destination());
System.out.println("The Check sum :" + packet.getHeader(udp).checksum());
System.out.println("The Legnth of packet :" + packet.getHeader(udp).getHeaderLength());
Вы не получаете полные пакеты DNS - на самом деле, если эти 8 байтов являются только заголовком UDP, вы вообще не получаете никакой полезной нагрузки DNS. Самая маленькая юридическая полезная нагрузка DNS составляет 12 байт (на RFC 1035) – Alnitak
А, глядя на ваш код, вы печатаете неправильное значение - ваша строка говорит, что вы печатаете длину пакета, но вы на самом деле печатаете заголовок UDP длина. – Alnitak