2

データリンク層からすべてのIPv4パケットを取得するrawソケットを作成しました(データリンク層ヘッダーは削除されています)。そして、私が使用するパケットを読み取るためにrecvfrom

私の疑問は次のとおりです。OSによって行われたスケジューリングのために、私のプロセスが1秒間スリープしていたとします。目覚めたとき、recvfromこのrawソケットで(受信するバイト数はたとえば1000で)、( IPv4パケットを1つだけ受信し、このパケットのサイズは380バイトであると言うことを意図して)実行しました。また、この間に多くのネットワークアプリケーションも同時に実行されていたため、すべてのIPv4パケットがこのソケットの受信バッファーにキューイングされている必要があります。したがってrecvfrom、1000バイトすべてを返します(381番目以降の他のIPv4パケットを含む)bcozは、バッファに返すのに十分なデータがあります。私のプログラムは1つのIPv4パケットのみを理解することを目的としていましたが

では、このことを防ぐ方法は?バイトごとに読み取り、各バイトを解析する必要がありますが、非常に非効率的です。

4

2 に答える 2

2

IIRCrecvfrom()は、キューにさらにパケットがある場合でも、一度に1つのパケットのみを返します。

于 2009-11-25T10:25:50.890 に答える
1

rawソケットはパケット層で動作し、データストリームの概念はありません。

recvmmsg()1回のシステムコールで複数のパケットを読み取りたい場合に興味があるかもしれません。最近のLinuxカーネルのみで、同等の送信側の実装はありません。

于 2010-08-18T09:45:55.893 に答える