Pcap 和 WinPcap 有多相似?

How similar are Pcap and WinPcap?

我正在尝试进行跨平台开发,windows 7 主机,QNX Neutrino 目标。在尝试进行跨平台开发之前,我想在我的主机上测试和使用代码,但 Windows.

不支持 Pcap

Pcap 和 WinPcap 之间的 syntax/function 调用有多相似?我可以将我为 WinPcap 编写的代码用于 Pcap 和另一台机器吗?

(大概你的意思是 "libpcap and WinPcap";"pcap" 指的是 "libpcap and WinPcap" 或它们都使用的文件格式。)

WinPcap 是 libpcap 到 Windows 的端口,并且共享很多 libpcap 的代码。它包括:

  • 一个 pcap-win32.c 文件,其中包含 "adaptation layer" 以支持 Windows 上独立于平台的 API(就像有 pcap-bpf.c 用于使用 BPF 的平台,pcap-linux.c 用于 Linux,等等);
  • 共享平台无关代码;
  • pcap-win32.c 调用的 Packet.dll 库,以及 Packet.dll 与之通信的驱动程序;
  • 一些添加的例程。

因此,libpcap 和 WinPcap 中的绝大多数调用 相同,并且 libpcap 和 WinPcap 之间共享的代码与 libpcap-on 之间共享的代码一样多-FreeBSD 和 libpcap-on-Linux.

API 区别是:

  • libpcap没有pcap_open()也没有远程抓包支持(以后会有commonAPI远程抓包支持,可以写代码在 Windows 和各种 UN*Xes 上进行远程捕获);
  • libpcap 没有 pcap_setbuff(),但如果您使用 pcap_create()pcap_activate() 打开实时捕获,较新的版本允许您设置捕获缓冲区大小,这些例程是也在较新版本的 WinPcap 中;
  • 如果你想使用平台的 "wait for input available on a set of input sources" 机制,不仅这些机制有不同的 APIs (select()/poll() vs. WaitForMultipleObjects()),APIs 获取要等待的句柄,必然是不同的;
  • libpcap 没有 "statistical mode"、采样或 "dump directly to a file in the kernel"(它们需要内核模式支持;在 Windows 上,WinPcap 必须包含一个驱动程序,因此可以提供,但是,在 UN*Xes 上,libpcap 取决于 OS 提供的内容);
  • libpcap 不支持任意调整 "minimum amount of data in the kernel buffer that causes a read from the application to return",尽管较新的版本确实支持 "immediate mode",其中数据包一到达就被传送;
  • libpcap 中一些较新的 APIs 还没有在 WinPcap 中(有些,例如 pcap_fopen_offline(),可能永远不会,因为不同版本的 MSVC 支持库不是二进制兼容的彼此)。

因此,对于几乎所有目的,只要您处理,应该可以编写适用于各种 UN*X(显然还有 QNX Neutrino)和 Windows 的基于 pcap 的代码与平台之间的其他差异。