2

ノンブロッキングの tun/tap ファイル記述子から IP パケットを読み取りたいので、ノンブロッキングとしてtunfd 設定しtunfd、libevent に READ_EV イベントを登録します。

イベントがトリガーされると、最初の 20 バイトを読み取って IP ヘッダーを取得し、次に残りを読み取ります。

nr_bytes = read(tunfd, buf, 20);
...
ip_len = .... // here I get the IP length
....
nr_bytes = read(tunfd, buf+20, ip_len-20);

しかし、read(tunfd, buf+20, ip_len-20) EAGAIN エラーが発生した場合、実際には完全なパケットがあるはずなので、いくつかのバイトがあるはずですが、なぜこのようなエラーが発生するのでしょうか?

tunfd はノンブロッキング モードまたは libevent と互換性がありませんか?

ありがとう!

4

1 に答える 1

6

TUN/TAP を使用した読み取りと書き込みは、データグラム ソケットでの読み取りと書き込みと同様に、完全なパケットに対して行う必要があります。小さすぎて完全なパケットに収まらないバッファに読み込むと、バッファがいっぱいになり、残りのパケットは破棄されます。書き込みの場合、部分的なパケットを書き込むと、ドライバーはそれを完全なパケットと見なし、切り捨てられたパケットをトンネル デバイス経由で配信します。

tunしたがって、TUN/TAP デバイスを読み取るときは、またはtapインターフェイスで構成された MTU と少なくとも同じ大きさのバッファーを提供する必要があります。

于 2013-06-17T03:26:09.420 に答える