如何仅通过我的程序捕获,而不是通过OS提供的网络堆栈捕获?

时间:2016-03-11 04:46:52

标签: networking linux-kernel pcap netfilter

我正在一个项目中工作,我需要通过自己和进程捕获网络数据包。我不能让现有的网络堆栈操作系统来处理这些数据包。我知道我可以使用pcap库来捕获数据包。但问题是相同的数据包,我使用pcap捕获将由exisitng OS网络堆栈处理。但我想只通过我的程序处理这些数据包,而不是通过操作系统处理。 请详细说明如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用预构建的内核和接口驱动程序,这将是不可能的AFAIK。如果您可以控制内核或接口设备驱动程序,可以查看以下几个地方。

  1. net / core / dev.c,netif_rx()函数。大多数网络设备驱动程序调用此函数将接收的数据包传递到网络堆栈
  2. 在您的界面驱动程序中,在调用netif_rx()
  3. 之前

    您可以编写一个自定义设备驱动程序,该驱动程序将实现一个队列,您的用户空间应用程序可以读取该队列。

答案 1 :(得分:0)

我从来没有尝试过这个,但我相信你可以通过使用预载库来覆盖所有必要的网络功能(例如socketconnect,{{ 1}},listenbind等)。重建会有很多重要的功能,但这是可能的。

我不知道这是最好的选择,但可能会根据您的要求进行调查。