这次使用pcap_next_ex()来代替pcap_loop()来捕获数据包。基于回调包捕获机制的pcap_loop()在某些情况下是不错的选择。但是在一些情况下处理回调并不特别好:这会使程序变的复杂并且在象多线程或C++类这些情况下它看起来到象一块绊脚石。
在这些情况下pcap_next_ex()允许直接调用来接收包,它的参数和pcap_loop()相同:有一个网卡描述符和两个指针,这两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,另一个是接收数据的缓冲区。
程序代码:
注:pcap_next_ex()只在Win32环境下才行因为它不是原始libpcap API中的一部分,这就意味着依赖于这个函数的代码不会在UNIX下工作。那么为什么用pcap_next_ex()而不用pcap_next()?因为pcap_next()有许多限制在很多情况下并不鼓励用它。首先它的效率很低因为它隐藏了回掉方法并且还依赖于pcap_dispatch()这个函数。再次它不能够识别文件结束标志EOF所以对来自文件的数据流它几乎无能为力。
注意当pcap_next_ex()在成功,超时,出错和文件结束的情况下会返回不同的值。