xinetd スーパーサーバーを介して小さな Java サーバーを実行しています。元のクライアント IP を取得したいのですが、ストリームが xinetd と Java (stin/stdout) の間にあるため取得できません。
誰かが xinetd logfile を見ずにクライアント IP を取得する方法を知っていますか? (私には悪い解決策のようです)
ありがとう !
あなたが説明した状況を考えると、xinetd ログファイルをトロールすることが唯一の選択肢です。
Java アプリケーションが標準入力および標準出力を介してクライアントと通信している場合、アプリケーションが基礎となるソケットにアクセスする方法はありません。実際、どの言語でもこれを行うことはできないと思います。
EDIT : 実際には、ファイル記述子 (fds) を公開し、fds を使用してソケット操作を行うためのライブラリ API があるため、C および C++ でおそらくこれを行うことができます。
ただし、純粋な Java では機能しません。System.in
またはに関連付けられた Stream オブジェクト内の fd にドリルダウンできたとしても、Java クラス ライブラリが fd をオブジェクトSystem.out
に変換するための API を提供しているとは思いません。Socket
fd の 0 と 1 でソケット操作を行うには、JNI とネイティブ コードに頼る必要があります。
また、コメンターが指摘しているように、実際のクライアントがプロキシの背後にある場合、ソケットから取得するクライアント IP はプロキシの IP になります。
getpeername
TCP ソケット (UDP ではない) で呼び出すことができると思います。Stevens の章 4.10を参照してください。