我有一个程序将一组 TCP SYN 数据包发送到主机(使用原始套接字)并使用libpcap
(使用过滤器)来获取响应。我正在尝试在异步 I/O 框架中实现这一点,但似乎缺少一些响应(即当它在 TCP SYN 和响应之间libpcap
花费的时间少于一系列的第一个数据包时)。100 microseconds
pcap 句柄设置如下:
pcap_t* pcap = pcap_open_live(NULL, -1, false, -1, errorBuffer);
pcap_setnonblock(pcap, true, errorBuffer);
然后我添加一个过滤器(包含在 filterExpression 字符串中):
struct bpf_program filter;
pcap_compile(pcap, &filter, filterExpression.c_str(), false, 0);
pcap_setfilter(pcap, &filter);
pcap_freecode(&filter);
在一个循环中,在发送每个数据包后,我使用 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);
并阅读它:
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).
}
}
正如我之前所说,一些数据包被遗漏(落入“没有收到”的其他情况)。我知道这些数据包在那里,因为我可以以同步方式(使用tcpdump
或正在运行的线程pcap_loop
)捕获它们。我在这里遗漏了一些细节吗?或者这是一个问题libpcap
?