我編程使用libevent的網絡程序返回的文件描述符的實時使用。的libpcap:由pcap_get_selectable_fd
在這個程序中,我想捕捉使用libpcap的數據包,修改這些數據包,然後發送出去。這些步驟應該是實時的。
所以我創建了一個實時捕捉,使用pcap_get_selectable_fd獲得的實時捕捉文件描述符pcap_fd
和pcap_fd
添加READ_EV事件到libevent的循環。 無論如何,它就像select()或epoll()輪詢文件描述符。
但我注意到按預期程序不能正常工作,所以我使用tcpdump和一些調試日誌,以檢查問題。我注意到有時,pcap_fd
上的輪詢無法正常工作,例如,在開始時,它似乎工作正常。一段時間後,pcap_fd
的READ_EV事件在2秒後觸發,這實際上是一個很大的延遲。
我讀了mannual,它說:
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()
或pcap_dispatch
輪詢實時捕捉,是不是?那麼我的輪詢可能會非常耗費CPU? !
感謝