LD_PRELOAD 変数を介して JVM を挿入しています。
基本的には、仮想ルーティング テーブル (VRT) を構築したいと考えています。bind() 呼び出しで、IP アドレスとポートのパラメーターを自分の選択 (VRT に保存) に変更します。また、ソケット記述子 (bind() の最初の引数) をリンク リストに追加します。(この段階まで、ソケットには AF_INET6 の sin_family タイプがあります)。
ソケットが閉じられたら (close())、仮想ルーティング テーブル エントリを削除します。そこで、閉じようとしているソケット記述子がリンク リストに格納されているかどうかを確認します。そうであれば、そのレコードが VRT に存在することを意味するため、ソケットを閉じる前に VRT エントリを削除する必要があります。私が直面している問題は、この段階で、同じソケット記述子の sin_family 値が 10 (AF_INET6、bind() 中の値) ではなく 1 (何の略かわかりません) になっていることです。また、この段階でソケット記述子の IP アドレスとポートを出力してみましたが、ゴミでした。
何が欠けているのかわからない。
更新: 私のコードに問題はありません。JVMの次の動作が原因で異常が発生しています(straceで追跡しました)
9722 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 12
...(receive messages)...
9722 dup2(11, 12) = 12 (?!?)
9722 close(12) = 0
JVM は、sin_family が close() で適切に表示されないため、ソケット上で別のファイル記述子を複製します。変!