我使用 libpcap 捕获大量数据包,然后处理/修改这些数据包并将它们发送到另一台主机。
首先,我创建一个 libpcap 处理程序handle
并将其设置为 NON-BLOCKING,并用于pcap_get_selecable_fd(handle)
获取相应的文件描述符pcap_fd
。
然后我为此添加一个事件pcap_fd
到 libevent 循环中(就像 select() 或 epoll())。
为了避免频繁轮询这个文件描述符,每次有数据包到达事件时,我使用 pcap_dispatch 收集一个缓冲区的数据包并将它们放入队列packet_queue
中,然后调用process_packet
处理/修改/发送队列中的每个数据包packet_queue
。
pcap_dispatch(handle, -1, collect_pkt, (u_char *)packet_queue);
process_packet(packet_queue);
我使用 tcpdump 来捕获由 发送的数据包process_packet(packet_queue)
,并注意:
- 一开始,发送数据包之间的间隔很小
- 在发送了几个数据包之后,间隔变为大约 0.055 秒
- 发送20个数据包后,间隔变为0.031秒并保持为0.031秒
我仔细检查了我的源代码,没有发现导致如此大间隔的可疑块或逻辑。所以不知道是不是功能的问题pcap_dispatch
。
pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!