私は非常に奇妙な状況に遭遇しました。sendto()はエラーコードENETDOWNを返します
私のプログラムでは、sendto()
関数は、ネットワークが稼動しており、tryingが成功しても、エラーコードENETDOWN(Network is down)
を返します。
ストリームは、UDPストリームが複数のゲートウェイを介して他のネットワークに接続されている場合にのみ発生します。時々いつも起こるとは限らない。 同じサブネットワーク下で同じコードを実行すると、ENETDOWN
のようなエラーはありません。
したがって、トレースsendto()
は、カーネル領域に機能します。 の機能は、ip_finish_output2()
のiop_output.c
を呼び出してhh->hh_output()
を呼び出し、ENETDOWN
エラーコードを返します。
機能がdev_queue_xmit()
に割り当てられ、dev.c
に割り当てられ、パケットがネットワークに送信されます。
問題が発生した場合は、のにあるneigh_blackhole()
の機能に割り当てられているようです。 neigh_blackhole()
は-ENETDOWN
コードを返します。
しかし、neigh_destroy()
が呼び出された時期とその理由がわかりません。
私はこの問題を数週間苦労しています。
私のプログラムが動作しているマシンがICMPリダイレクトメッセージを受信した場合、ネイバーは削除できますか? – shin2011
「ホスト向けのリダイレクト」コードと新しいゲートウェイアドレスを持つICMPリダイレクトメッセージが表示されます。 – shin2011
私は、ICMPリダイレクトがこれを引き起こすかどうかを確認するためにカーネルコードを調べていませんが、確かに可能です。私は一時的なものとして-ENETDOWNエラーを処理し、再試行することをお勧めします。遅れていても、バックオフを使っている可能性もあります。 –