加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从混杂的网络设备读取

发布时间:2020-12-16 03:18:31 所属栏目:百科 来源:网络整理
导读:有人知道如何从C中的混杂(或嗅探)设备读取?我知道你需要root访问权限,但是我想知道有没有人知道这样做有什么功能(普通套接字在这里似乎没有意义)?我想为无线流量写一个实时分析工具. 解决方法 在 Linux上,您可以使用PF_PACKET套接字从原始设备读取数据,例
有人知道如何从C中的混杂(或嗅探)设备读取?我知道你需要root访问权限,但是我想知道有没有人知道这样做有什么功能(普通套接字在这里似乎没有意义)?我想为无线流量写一个实时分析工具.

解决方法

在 Linux上,您可以使用PF_PACKET套接字从原始设备读取数据,例如以混杂模式运行的以太网接口:
s = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))

这将会将收到的每个数据包的副本发送到您的套接字.尽管如此,您很可能不希望每个数据包.内核可以使用BPF(Berkeley Packet Filter)执行第一级过滤.BBF本质上是一个基于堆栈的虚拟机:它处理一小组指令,例如:

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

BPF的退出代码告诉内核是否将数据包复制到套接字.可以使用setsockopt(s,SOL_SOCKET,SO_ATTACH_FILTER)直接写入相对较小的BPF程序. (警告:内核采用一个struct sock_fprog,而不是一个struct bpf_program,不要混合这些,或者你的程序在某些平台上不起作用).

对于任何相当复杂的事情,你真的想使用libpcap. BPF在可以做的事情上受到限制,特别是在每个数据包可执行的指令数量上. libpcap将负责将一个复杂的过滤器分成两部分,内核执行第一级过滤,并且更有能力的用户空间代码丢弃了实际上不想查看的数据包.

libpcap还将内核接口从应用程序代码中抽出出来. Linux和BSD使用类似的API,但是Solaris需要DLPI和Windows使用别的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读