【发布时间】:2011-10-15 19:24:06
【问题描述】:
我只想解析来自 WireShark 使用 libpcap 库生成的 .pcap 文件中的 RTP 数据包。
我已经看到了许多在设备上使用libpcap 获取数据包的示例,但我找不到任何可以从.pcap 文件中提取特定数据包的示例。
任何人都知道此类示例的链接或任何拥有示例代码的人。
谢谢。
【问题讨论】:
我只想解析来自 WireShark 使用 libpcap 库生成的 .pcap 文件中的 RTP 数据包。
我已经看到了许多在设备上使用libpcap 获取数据包的示例,但我找不到任何可以从.pcap 文件中提取特定数据包的示例。
任何人都知道此类示例的链接或任何拥有示例代码的人。
谢谢。
【问题讨论】:
libpcap 使用函数 pcap_compile 和 pcap_setfilter(用示例代码描述 here)在开始捕获循环之前过滤数据包。过滤器语法在man page for TCPDump
过滤 RTP 数据包带来了进一步的挑战,因为它们不是通过标准端口发送的,并且没有其他方便的方法来检测协议。用于 RTP 的端口由 RTP 设置之前的控制通道协议(例如 SIP)协商。 This example 包含一条 SIP 消息,其中 rport=5060 行给出了用于 RTP 的 UDP 端口(见下文)。
因此,检测 RTP 需要检查 SIP 协议数据包(或其他信令协议以找出要过滤的 RTP 端口。
SIP/2.0 200 OK
Call-ID: 29858147-465b0752@29858051-465b07b2
Contact: pel<sip:35104723@192.168.1.2:5060;line=7d36558f31367051>;q=0.500;expires=1200
CSeq: 6 REGISTER
From: <sip:35104723@sip.cybercity.dk>;tag=659abf
P-Associated-URI: <sip:35104723@sip.cybercity.dk>
To: <sip:35104723@sip.cybercity.dk>;tag=00-04087-1701bae7-76fb74995
Via: SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp6658824-465059f1192.168.1.2
【讨论】:
pcap_compile 函数是否有任何直接过滤选项,或者我需要为此使用 BPF。如果是 BPF,那么我如何在其中指定协议?