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