ubuntu - 使用 pcap_next_ex() 可以很好地捕获,但以太网标头大小不同。14 个使用 Ubuntu,4 个使用 FreeBSD
问题描述
我有一个正在运行的应用程序,需要在我的本地平台上正确执行,运行 Ubuntu 18.4,并重新编译,在 FreeBSD 平台上运行。
我遇到了数据包问题,因为在 FreeBSD 平台上以太网标头短了 10 个字节
在收到数据包后,我通过查看数据包中始终存在于我的数据中的 ICMP 标头中的数据来适应软件中的差异。知道该数据的偏移量可以告知有关标头大小的决定。
一旦我知道以太网标头的大小,我就将其剥离,并且在设备之间保持一致。
但是,我很困惑,有一个我无法理解的区别。谁能指出我的文档描述了 4 或 14 字节差异的原因?
我已经探索了网络以寻找解释,但没有发现任何可以证明差异的证据。甚至 FreeBSD 'Ethernet.h' 也显示 14 个字节。
#define ETHER_HDR_LEN (ETHER_ADDR_LEN*2 + ETHER_TYPE_LEN) where that is (6*2)+2 equals 14
解决方案
如果您在环回接口上捕获(lo
在 Linux 上,lo0
在 FreeBSD 上),则无法保证数据包将具有以太网标头。它们在 Linux 上运行,但在 FreeBSD(以及 NetBSD 和 OpenBSD 以及 DragonFly BSD 和 macOS)上有不同的标题;该标头长 4 个字节。
一旦你打开了一个捕获接口,你必须调用; 这告诉你标题是什么。你不能假设一个以太网头。pcap_datalink()
pcap_t
有关您可能看到的链路层标头类型的描述,请参阅此链路层标头类型列表。pcap_datalink()
返回 DLT_ 值,而不是 LINKTYPE_ 值,因此将其结果与该页面中的 DLT_ 值进行比较。
推荐阅读
- javascript - Material UI:如何在Material UI TreeView中同时折叠和展开?
- javascript - 替换 currentUser.updateEmail 的 Firebase 9(模块化 sdk)
- python - 如何通过 python 脚本为 YOLO 标记图像
- javascript - 'global' 是 Javascript 中的一个函数吗?
- python - Python pandas 基于与列表项的部分匹配替换
- git - 从 Visual Studio 提交对 git 的更改时出现致命错误
- python - 使用 Sphinx 和 `sphinx.ext.autosummary` 为外部 `pybind11` 模块递归生成文档
- android - debug.keystore 为记事本打开,但它适用于 godot 3.3
- r - 删除绘图对象的自动选择或锁定模式栏
- reactjs - '不变违规:requireNativeComponent:在 UIManager 中找不到“RNSScreen”。' 反应本机cli错误