当前位置: 首页 > 面试题库 >

从混杂的网络设备中读取

何德寿
2023-03-14
问题内容

我想编写一个用于无线流量的实时分析工具。

有谁知道如何从C中的混杂(或嗅探)设备读取数据?

我知道您需要具有root用户访问权限才能执行此操作。我想知道是否有人知道执行此操作所需的功能。普通的插座在这里似乎没有意义。


问题答案:

在Linux上,您使用PF_PACKET套接字从原始设备读取数据,例如以混杂模式运行的以太网接口:

s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

这会将收到的每个数据包的副本发送到您的套接字。但是,您很可能并不需要所有数据包。内核可以使用BPF(伯克利分组过滤器)执行第一级过滤。BPF本质上是一个基于堆栈的虚拟机:它处理一小部分指令,例如:

ldh = load halfword (from packet)  
jeq = jump if equal  
ret = return with exit code

BPF的退出代码告诉内核是否将数据包复制到套接字。可以使用setsockopt(s,SOL_SOCKET,SO_ATTACH_FILTER,)直接编写相对较小的BPF程序。(警告:内核采用的是sock_fprog结构,而不是bpf_program结构,请勿混用,否则您的程序将无法在某些平台上运行)。

对于相当复杂的任何事情,您真的想使用libpcap。BPF的功能受到限制,尤其是每个数据包可以执行的指令数受到限制。libpcap将负责将一个复杂的过滤器分为两部分,内核执行第一级过滤,而功能更强大的用户空间代码将丢弃实际上不希望看到的数据包。

libpcap还从应用程序代码中抽象出内核接口。Linux和BSD使用类似的API,但是Solaris需要DLPI,而Windows使用其他东西。



 类似资料:
  • 我是新来的JavaScript,所以我可能有一些非常规的编程方式。也就是说,我正在做一个项目,我需要读写数据到自定义BLE设备。我使用gatt服务器协议进行连接。我能够与设备连接,但现在我试图从寄存器中读取数据。 我看了从谷歌以及网络蓝牙github的网络样本,但我无法理解它。下面的代码是我目前试图打破这一点。早期的尝试让我陷入了这样一个事实,即我得到的值是一个对象或一个promise对象。

  • Linux提供了许多虚拟设备,这些虚拟设备有助于构建复杂的网络拓扑,满足各种网络需求。 网桥(bridge) 网桥是一个二层设备,工作在链路层,主要是根据MAC学习来转发数据到不同的port。 # 创建网桥 brctl addbr br0 # 添加设备到网桥 brctl addif br0 eth1 # 查询网桥mac表 brctl showmacs br0 veth veth pair是一对虚拟

  • 我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。 我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。 我找到了以下代码: 假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此

  • 我读过很多关于用Android通过代码读取APN的话题,自从Android 4.2以来,这似乎已经不可能了。然而,所有的主题都超过了2/3年,我想知道是否有一个好的解决方案,使我能够读取设备的当前APN。我看到过一些关于SQLiteWrapper的东西,但它不起作用,或者我只是没有足够的资格让它起作用。

  • 有一些webpack开发服务器配置(它是整个配置的一部分): 我使用以下命令执行webpack: 我可以在我的本地机器上使用< code > http://localhost:8080 访问开发服务器,但我还想从我的手机、平板电脑(它们在同一个Wi-Fi网络中)访问我的服务器。 如何启用它?谢谢

  • 问题内容: 我正在使用蓝牙聊天功能,以便连接和接收来自蓝牙设备的数据。 我使用以下代码读取数据: 设备一直在发送数据而不会停止。 通过上面的代码,我得到以下消息: 然后转到下一行: 并且永远不会从该呼叫中返回。我猜这是因为它开始从设备读取数据,并且直到断开连接才停止。如何一次读取一定数量的字节? 编辑 除非由于它不保留代码,否则不从设备取回任何数据? 问题答案: 我改用DataInputStrea