1

そのため、PCap ライブラリの受信機能に問題がありました。

パケットを取得して方向転換するだけのエコーサーバーを(PCの外に)セットアップしました。したがって、私のアプリケーションでは、(正常に動作する) パケットを送信し、pcap_next() を使用して (エコー サーバーから) 応答パケットを受信しようとしました。何らかの理由で、Wireshark がパケットが 1 ミリ秒未満で方向転換したことを示している場合でも、pcap_next() でパケットを受信するのに 1 秒待機します。したがって、1000 パケットを送信すると、すべての応答を受信するのに 1000 秒かかります。

なぜそうしているのかわからなかったので、 pcap_loop() に切り替えてみました。どうやら今、それはさらに奇妙なことをしている。1000 パケットを送信し、1000 パケットを受信しましたが、期待した順序ではありません。

私はこれを期待しています (これは Wireshark で見られるものです):

Send packet #1
Receive packet #1
Send packet #2
Receive packet #2
etc.

しかし、これは私が本当に得るものです:

Send packet #1
Send packet #2
etc.
Wait 1 second
Receive packet #1
Receive packet #2
etc.

何が起きてる?

4

2 に答える 2

0

解決策を考え出しました。TX と RX を 2 つの別々のスレッドに配置する必要がありました。

RXスレッドはこれを永久に行います:

pcap_loop(handle, -1, got_packet, NULL);

次に、必要なときにいつでも TX スレッドを呼び出します。これにより、これが実行されます (必要な回数だけループします)。

pcap_sendpacket(t, TxPacket, DataLen + 42);

これで問題は解決しました。

于 2011-06-14T23:02:10.453 に答える
0

おそらく、プルするのではなく、ポーリングしたいでしょう。pcap_dispatchorに電話するだけpcap_loopで、できるだけ早くパケットで折り返し電話します。pcap_nextディスパッチ ループを開始し、最初のパケットを受信した後に停止するため、効率的ではありません。詳細については、http://www.tcpdump.org/pcap.htmlを参照してください。

于 2011-06-10T20:33:28.773 に答える