【问题标题】:Receiving Full modified icmp packet in Linux raw socket在 Linux 原始套接字中接收完整修改的 icmp 数据包
【发布时间】: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


【解决方案1】:

据我发现,显然没有办法在原始套接字中捕获完整的数据包,并且仍然让套接字为您进行过滤。我所要做的就是以这种方式打开一个套接字:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2022-01-01
    • 2016-07-10
    • 2018-11-16
    • 2012-11-12
    • 2012-01-07
    • 2013-10-02
    相关资源
    最近更新 更多