我正在使用pcap4j读取Java中的数据包。我想在收到中止的数据包时生成警报。目前,我无法为中止应用过滤器。我在下面附加了代码。
PcapHandle handle;
Pcap pcap;
handle =
Pcaps.openOffline("D://nm_postpaid_testing.pcap",TimestampPrecision.NANO);
//handle.setFilter("tcap.reason == 11", BpfCompileMode.OPTIMIZE);
System.out.println("Starting output: ");
PcapPacket packet = null;
String filter = "pcap abort 11";
handle.setFilter(filter, BpfCompileMode.OPTIMIZE);
PacketListener listener = new PacketListener() {
@Override
public void gotPacket(PcapPacket pp) {
System.out.println("/////////////START////////////////");
System.out.println(Arrays.toString(pp.getRawData()));
SctpDecoder sctpDecoder = new SctpDecoder();
//sctpDecoder.decode(pp.getRawData(), "IP", "*", true, "DECODE:TCAP");
System.out.println("///////////////END//////////////\n");
}
};
handle.loop(4, listener);
答案 0 :(得分:0)
捕获过滤器pcap abort 11
无效(第13行)。您可以像这样用dumpcap -d -f "<filter>"
进行测试:
bash-5.0$ dumpcap -d -f "pcap abort 11"
Capturing on 'Wi-Fi: en0'
dumpcap: Invalid capture filter "pcap abort 11" for interface 'en0'.
That string isn't a valid capture filter (syntax error in filter expression: syntax error).
See the User's Guide for a description of the capture filter syntax.
如果有效,dumpcap将为您显示过滤器的BPF指令。
您有一个tcap.reason == 11
(第7行),该密码有效,并且您可能希望在适用的情况下重复使用它。
答案 1 :(得分:0)
pcap abort 11
不是有效的捕获/ bpf过滤器。
我没有使用pcap4j的经验,但是从setFilter API documentation开始,它似乎希望使用捕获/ bpf过滤器,而不是显示过滤器。
here说明了显示过滤器和捕获过滤器之间的区别。
据我所知,没有可用于过滤TCAP中止消息的捕获/ bpf过滤器。
中止的有效显示过滤器为tcap.dialogueAbort_element
,tcap.abort_source
或tcap.reason == 10 or tcap.reason == 11
,但我不知道如何将其与pcap4j一起使用
对于您的用例,pcap4j
的另一种选择是使用tshark或sharkd解码捕获,这两个程序都支持显示过滤器,而tshark支持JSON(-T json
)和您可以在Java中轻松处理的XML(-T pdml
)输出格式。
答案 2 :(得分:0)
pcap库(libpcap / WinPcap / Npcap)可以进行的过滤非常有限;它无法测试任何像TCAP中止一样复杂的事情。您必须通过编写自己的代码或通过使用Wireshark / TShark / sharkd的代码以某种方式详细分析数据包,以确定您拥有的数据包是否是TCP中止。