【问题标题】:How similar are Pcap and WinPcap?Pcap 和 WinPcap 有多相似?
【发布时间】:2015-07-22 18:35:20
【问题描述】:
我正在尝试做跨平台开发,windows 7 主机,QNX Neutrino 目标。在尝试让跨平台开发工作之前,我想在我的主机上测试和使用代码,但 Windows 不支持 Pcap。
Pcap 和 WinPcap 之间的语法/函数调用有多相似?我可以将我为 WinPcap 编写的代码用于 Pcap 和其他机器吗?
【问题讨论】:
标签:
windows
cross-platform
libpcap
winpcap
qnx-neutrino
【解决方案1】:
(大概您的意思是“libpcap 和 WinPcap”;“pcap”指的是“libpcap 和 WinPcap”或它们都使用的文件格式。)
WinPcap 是 libpcap 到 Windows 的一个端口,并且共享了很多 libpcap 的代码。它包括:
- 一个 pcap-win32.c 文件,其中包含“适配层”以支持 Windows 上与平台无关的 API(就像使用 BPF 的平台有 pcap-bpf.c 和 Linux 的 pcap-linux.c 一样,等);
- 共享平台无关代码;
- pcap-win32.c 调用的 Packet.dll 库,以及 Packet.dll 与之通信的驱动程序;
- 添加了一些例程。
因此,libpcap 和 WinPcap 中的绝大多数调用相同,并且在 libpcap 和 WinPcap 之间共享尽可能多的代码,例如 libpcap-on-FreeBSD 和 libpcap-在 Linux 上。
API 的区别是:
- libpcap 没有
pcap_open() 也没有remote-capture 支持(未来会有通用的API 来支持remote-capture,所以可以编写代码在Windows 和各种UN 上做remote-capture *Xes);
- libpcap 没有
pcap_setbuff(),但如果您使用pcap_create() 和pcap_activate() 打开实时捕获,则较新版本允许您设置捕获缓冲区大小,并且这些例程也在较新版本的 WinPcap 中;
- 如果您想使用平台的“等待一组输入源上可用的输入”机制,不仅这些机制具有不同的 API(
select()/poll() 与 WaitForMultipleObjects()),API获得等待的句柄必然是不同的;
- libpcap 没有“统计模式”、采样或“直接转储到内核中的文件”(这些需要内核模式支持;在 Windows 上,WinPcap 必须包含驱动程序,因此可以提供,但是,在 UN*Xes 上,libpcap 取决于操作系统提供的内容);
- libpcap 不支持任意调整“导致从应用程序读取返回的内核缓冲区中的最小数据量”,尽管较新的版本确实支持“立即模式”,即数据包在到达;
- libpcap 中的一些较新的 API 尚未出现在 WinPcap 中(有些,例如
pcap_fopen_offline(),可能永远不会出现,这要归功于不同版本的 MSVC 支持库彼此不兼容二进制)。
因此,对于几乎所有目的,只要您处理平台之间的其他差异,就应该可以编写适用于各种 UN*X(显然还有 QNX Neutrino)和 Windows 的基于 pcap 的代码.