0

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() で適切に表示されないため、ソケット上で別のファイル記述子を複製します。変!

4

1 に答える 1

0

sin_family == 1AF_UNIX、つまりパイプまたはドメイン名ソケットです。


それが本当に「同じ」ソケット記述子であると確信していますか?どのようにそれを識別しますか?整数値はプロセスにのみ固有です。

あなたがLD_PRELOAD子供をフォークするプロセスの場合、彼らはあなたのフックも親と同じ記述子のセットを使用して使用し、すべての兄弟と子供が行います。

したがって、このあいまいさを解決するgetpid()には、フックbind()コードで使用しているPIDを取得し、このソケット用に保存しているキーにPIDを追加します。


dup2(int fdOld, int fdNew)fdNewのコピーを作成する前に閉じますfdOld。しかし、あなたはそれに呼び出しをフックすることはできませんclose()、私は推測します:-(。

于 2012-05-03T18:48:00.323 に答える