我使用libpcap从PPP接口捕获数据,并添加过滤器如下:
char filter_exp[] = "ip";
但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式是
不正确,标题大小不是20字节。
当我从eth0捕获数据包时,一切正常。
那么谁能告诉我如何通过libpcap从PPP接口获取正确的ip数据包,谢谢!
答案 0 :(得分:2)
但是当我在回调函数中嗅探数据包时,我发现ip包的格式不正确,标题大小不是20字节。
您的回调函数正在使用pcap_datalink()
上pcap_t
调用的结果来确定如何解析数据包,或者您已根据{{1}的结果指定了不同的回调函数,对吧?
如果没有,你可能假设数据包将具有特定的链路层头类型,这总是错误的。
PPP数据包不一定具有与以太网数据包相同的链路层头类型(尽管在Windows上使用WinPcap,它们可能具有相同的链路层头类型!)。他们可能也没有PPP标头;特别是在Linux上,它们会有一个Linux cooked capture header因为,至少在某一点上,内核会剥离PPP头并提供 no 链接层标题,因此libpcap必须进行“熟”捕获才能获得网络层协议类型。对于Linux上的PPP设备,pcap_datalink()
将返回pcap_datalink()
,而不是DLT_LINUX_SLL
,以表明这一点。
答案 1 :(得分:0)
PPP和IP是完全不同的协议。如果您通过PPP传输IP数据报,那么您将它们包装在PPP报头中,并将IP数据包作为有效负载。在IP数据包之前,您需要从数据包中剥离PPP信息。