【发布时间】:2013-10-22 08:46:08
【问题描述】:
我有一个特定的网卡 (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 字节时间戳?
谢谢
伊多
【问题讨论】:
-
您可以尝试使用带有 AF_PACKET 选项的 socket() 吗? (详见 man 7 packet)这将帮助您从 L2 级别捕获数据包,因此丢弃时间戳信息的机会可能会消失。我怀疑您需要在设备驱动程序级别捕获数据包以获取时间戳信息。
-
是的。到目前为止,只有第二个选项 (socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))) 对我有用。但是这样我必须自己解析所有数据并找出它是否是一个与我相关的 ICMP 数据包。我寻找更好的 L2 数据包分辨率,但没有找到。
-
为您的目的解析问题吗?
-
我不希望自己进行解析(截止日期很短),但我认为我必须这样做。我将尝试在我的驱动程序周围的 java 层中使用jnetpcap
-
顺便说一句,你体验过原生 Linux 包过滤技术吗?
标签: c++ c linux icmp raw-sockets