我有发送一组TCP SYN数据包的到主机(使用原始套接字),并使用一个程序libpcap
(具有过滤器),以获得响应。 我想在异步I / O框架来实现这一点,但似乎libpcap
缺少一些响应的(即一系列的第一包时只需不到100 microseconds
的TCP SYN和响应之间)。 该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
?