在Linux原始套接字中接收完整修改的icmp数据包

在Linux原始套接字中接收完整修改的icmp数据包

问题描述:

我有一个特定的网卡(NetFPGA),它在ICMP Echo Reply数据包的末尾添加了一个8字节的时间戳(忽略校验和)。当我试图通过这种方式读取数据包的原始套接字:在Linux原始套接字中接收完整修改的icmp数据包

recvsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 

我只是没有添加时间戳的IP + ICMP数据。 我想:

recvsock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); 

这样,我得到的一切,我不能绑定任何地址。 也试过:

recvsock = socket(AF_INET, SOCK_RAW, htons(ETH_P_IP)); 

但没有被抓了..

任何想法,我怎么能打开一个原始套接字将只捕获特定的ICMP回显应答报文,但不会忽略附加8字节的时间戳?

感谢

+0

你可以尝试使用带有AF_PACKET选项的socket()吗? (有关详情,请参见man 7包)这将帮助您从L2级捕获数据包,因此丢弃时间戳信息的机会可能会消失。我怀疑您需要在设备驱动程序级别捕获数据包以获取时间戳记信息。 –

+0

是的。直到现在,只有第二种选择(套接字(AF_PACKET,SOCK_RAW,htons(ETH_P_IP)))为我工作。但是这样我就必须解析我自己的所有数据,并找出它是否与我有关的ICMP数据包。我寻找更好的L2数据包分辨率,但没有找到。 – Ido

+0

正在为您的目的解析问题吗? –

从我发现显然是没有办法赶上原始套接字全包,仍然使插座做过滤为您服务。果然不出我所要做的就是建立一个socket这样:

recvsock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); 

为了捕捉所有传入的IP数据包,然后基于libpcap的过滤功能,过滤掉我的ICMP数据包。