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 的代码与平台之间的其他差异。
我正在尝试进行跨平台开发,windows 7 主机,QNX Neutrino 目标。在尝试进行跨平台开发之前,我想在我的主机上测试和使用代码,但 Windows.
不支持 PcapPcap 和 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 的代码与平台之间的其他差异。