2011-07-24 66 views
2

我发现这个职位在stackoverflow.com listening using Pcap with timeout如何在libpcap的包超时定期接收功能

我面临着类似(但不同)的问题:什么是通用(平台无关)方法定期超时当通过使用libpcap数据包接收功能接收捕获的数据包时? 其实,我想知道是否有可能从pcap_dispatch(pcap_t ...)/ pcap_next_ex(pcap_t ...)周期性地超时?如果可能的话,我可以像使用经典的select(... timeout)函数一样使用它们(http://linux.die.net/man/2/select)。

另外,从官方网页(http://www.tcpdump.org/pcap3_man.html),我发现原来超时机制被认为是越野车和平台特定的(这是不好的,因为我的程序可以在不同的Linux和Unix服务器上运行):
”。 .. to_ms指定以毫秒为单位的读取超时。读取超时用于安排当看到数据包时读取不一定立即返回,而是等待一段时间以允许更多数据包到达并且不是所有平台都支持读取超时;在不支持读取超时的平台上,读取超时被忽略......
注意:当读取实时捕获时,pcap_dispatch()在阅读时间结束时不一定会返回;在某些平台上rms,不支持读取超时,并且在其他平台上,直到至少有一个数据包到达,计时器才会启动。这意味着,读超时不应该被)用在,例如,一个交互式应用程序,允许数据包捕获环,以“轮询”周期性用户的输入,因为没有保证pcap_dispatch(超时过期后会返回.. ......”

所以,我想我需要我自己来实现通用的(独立于平台)超时机制象下面这样?

  1. 创建pcap_open_live一个pcap_t结构()。
  2. 集它在非阻塞模式下使用pcap_setnonblock(pcap_t ...)
  3. 使用注册表来轮询此非阻塞pcap_t红色的OS定时器如:

注册OS timer_x,并重置timer_x;

而(1){

如果(timer_x超时) {做到这一点需要定期做了什么;通过调用pcap_dispatch(pcap_t ...)/ pcap_next_ex(pcap_t ...)来接收一些数据包}

调查pcap_t;复位timer_x;
对这些数据包做些什么;

} //而结束(1)

问候,
DC

+1

它视为特定于平台的,因为它是,但它是*不*考虑越野车(相信我,我是谁写的,在手册页文本的人) - 超时是保持'pcap_dispatch()'从等待永远为一个数据包缓冲区来填充*,而不是让它永远等待任何数据包到达。即使没有数据包到达,有些操作系统会超时,有些则不会。 – 2012-10-19 20:53:17

回答

1

你可以得到pcap_fileno手柄()和select()它。 OfferReceiver :: Listen()中有一个示例here

+0

这似乎是合理的。谢谢! – dumbcoder