Cでpingの実装について学んでいます。問題は、パケットを受信するために生のソケットを使用していることです。すべてのパケットに識別値がありますICMP header
。
複数の端末で動作していますping
。
たとえば、私はping google.com
3つの端末のうち3つを実行しています。
最初のpingのID値は23456、2番目のpingのID値は34564、3番目のpingのID値は98763です。
私の問題は、2番目のpingがパケット34564のIDを受け取る必要があり、ID値23456を受信することです。
各 ping に新しい生のソケットが作成されます。しかし、別のpingパケットを受信します。
他のpingパケットを受信する理由を説明できる人はいますか?
答え1
デフォルトでは、rawソケットはすべてのICMPパケットをキャプチャします。引用した内部番号は、現在のプロセスでパケットを識別するのとまったく同じです。 ICMPには、プロトコルスタックが各ソケットを逆多重化できるようにするポート番号はありません。
あなたの意見に答えるなら、パケットを受け取ったら失われたのではないでしょうか? pingなどのすべてのソケットは一致するすべてのパケットのコピーを取得するため、実行中のすべてのpingは受信したすべてのICMPパケットのコピーを取得します。