Locked History Actions

Diff for "thrift/remoteIP"

Differences between revisions 1 and 2
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
サーバ側に接続してきたクライアントのIPアドレスを取得する方法の一つ(他にもあるかもしれない)。 サーバ側に接続してきたクライアントのIPアドレスを取得する方法。
サーバ側の構成によって、異なる方法があるとおもわれる。
thrift-0.8.0の場合。

== TThreadPoolServerを改造する方法 ==
Line 5: Line 10:
thrift-0.8.0の場合
Line 33: Line 37:

※もちろん、thriftのソースコードを修正してしまった方が簡単だが、ここではあえてそうしないようにした。

リモートIPアドレスの取得

サーバ側に接続してきたクライアントのIPアドレスを取得する方法。 サーバ側の構成によって、異なる方法があるとおもわれる。 thrift-0.8.0の場合。

TThreadPoolServerを改造する方法

ここではTThreadPoolServerを使用するものとし、それを改造する。

  • TThreadPoolServerのソースをまるまるコピーし、名前をMyThreadPoolServerとでもする。

  • (どこでも良いのだが)MyThreadPoolServerのstaticフィールドとして以下を定義。

public static ThreadLocal<String> remoteIpAddress = new ThreadLocal<String>();
  • 内部クラスWorkerProcessのrun()メソッドの冒頭に以下を追加。

      try {
        Field field = TSocket.class.getDeclaredField("socket_");
        field.setAccessible(true);
        Socket socket = (Socket)field.get(client_);
        String ip = socket.getInetAddress().getHostAddress();
        remoteIpAddress.set(ip);        
      } catch (Exception ex) {
        ex.printStackTrace();
      }
  • ハンドラの中では以下のようにipアドレスを取得。

  String remoteIp = MyThreadPoolServer.remoteIpAddress.get();

※もちろん、thriftのソースコードを修正してしまった方が簡単だが、ここではあえてそうしないようにした。