异步libpcap:丢失数据包?

bru*_*ery 6 c++ asynchronous raw-sockets libpcap

我有一个程序,它将一组TCP SYN数据包发送到主机(使用原始套接字)并使用libpcap(使用过滤器)来获取响应.我试图在异步I/O框架中实现这一点,但似乎libpcap缺少一些响应(即,当它花费少于100 microsecondsTCP SYN和响应之间时,系列的第一个数据包).pcap句柄设置如下:

pcap_t* pcap = pcap_open_live(NULL, -1, false, -1, errorBuffer);
pcap_setnonblock(pcap, true, errorBuffer);
Run Code Online (Sandbox Code Playgroud)

然后我添加一个过滤器(包含在filterExpression字符串中):

struct bpf_program filter;
pcap_compile(pcap, &filter, filterExpression.c_str(), false, 0);
pcap_setfilter(pcap, &filter);
pcap_freecode(&filter);
Run Code Online (Sandbox Code Playgroud)

在循环中,在发送每个数据包之后,我使用select来知道我是否可以从libpcap读取:

int pcapFd = pcap_get_selectable_fd(pcap);
fd_set fdRead;
FD_ZERO(&fdRead);
FD_SET(pcapFd, &fdRead);
select(pcapFd + 1, &fdRead, NULL, NULL, &selectTimeout);
Run Code Online (Sandbox Code Playgroud)

阅读它:

if (FD_ISSET(pcapFd, &fdRead)) {
     struct pcap_pkthdr* pktHeader;
     const u_char* pktData;
     if (pcap_next_ex(pcap, &pktHeader, &pktData) > 0) {
         // Process received response.
     }
     else {
         // Nothing to receive (or error).
     }
}
Run Code Online (Sandbox Code Playgroud)

正如我之前所说的那样,一些数据包被遗漏(落入"无需接收"其他内容).我知道这些数据包在那里,因为我可以以同步方式捕获它们(使用tcpdump或运行线程pcap_loop).我在这里错过了一些细节吗?或者这是一个问题libpcap

bru*_*ery 2

这似乎是 Linux 下使用内存映射的 libpcap 的问题。详情请参阅我的另一个问题。