在Linux raw socket中接收完整修改的icmp数据包

时间:2013-10-22 08:46:08

标签: c++ c linux icmp raw-sockets

我有一个特定的网卡(NetFPGA),它在ICMP Echo Reply数据包的末尾添加一个8字节的时间戳(忽略校验和)。当我尝试以这种方式读取原始套接字中的数据包时:

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字节时间戳?

感谢
IDO

1 个答案:

答案 0 :(得分:0)

从我发现的内容显然无法捕获原始套接字中的完整数据包,仍然让套接字为您进行过滤。我必须做的就是以这种方式打开套接字:

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

用于捕获所有传入的IP数据包,然后根据libpcap过滤功能过滤掉我的ICMP数据包。