TCP SYN パケットのセットをホストに送信し (raw ソケットを使用)、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
ですか?