Locked History Actions

thrift/remoteIP

リモート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のソースコードを修正してしまった方が簡単だが、ここではあえてそうしないようにした。