我正在使用 libevent 为网络程序编程。
在这个程序中,我想使用 libpcap 捕获数据包,修改这些数据包,然后将它们发送出去。这些步骤应该是实时的。
所以我创建了一个实时捕获,使用 pcap_get_selectable_fd 获取pcap_fd
实时捕获的文件描述符并将 READ_EV 事件添加pcap_fd
到 libevent 循环。无论如何,这就像 select() 或 epoll() 轮询文件描述符。
但是我注意到程序没有按预期运行,所以我使用 tcpdump 和一些调试日志来检查问题。我注意到有时,轮询pcap_fd
无法正常工作,例如,在开始时,它似乎工作正常。一段时间后,READ_EV 事件在pcap_fd
2 秒后触发,这确实是一个很大的延迟。
我读了手册,上面写着:
pcap_get_selectable_fd(3) will return a file descriptor. But simple select()
or poll() will not indicate that the descriptor is readable
until a full buffer's worth of packets is received, even if the read
timeout expires before then.
在我看来,实时捕获已捕获大约 15 个数据包(每个数据包为 66 个字节),但 READ_EV 事件直到 2 秒后才会触发。但在一开始,即使 1 个数据包到达也可能触发 READ_EV 事件。这意味着它非常不稳定。
To work around this, an application that
uses select() or poll() to wait for packets to arrive must put the
pcap_t in non-blocking mode, and must arrange that the select() or
poll() have a timeout less than or equal to the read timeout, and must
try to read packets after that timeout expires, regardless of whether
select() or poll() indicated that the file descriptor for the pcap_t is
ready to be read or not.
我的问题是针对上面的段落:
1 在我看来有2个超时,一个读取超时和一个自己定义的超时,那么什么是读取超时呢?
2 在我看来,我需要设置一个非常小的超时并使用pcap_next()
or轮询实时捕获pcap_dispatch
,对吗?那么我的轮询可能会非常消耗 CPU?
谢谢!</p>