Network Protocol Java

/**
 * Copyright (c) 2006 Richard Rodgers
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//package com.monad.homerun.util;
import java.net.InetAddress;
import java.net.Inet6Address;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
/*
 * Class for determining a host's IP address.
 * Uses several techniques to circumvent OS-specific problems in
 * specific calls. For example, 'getLocalHost()' on Linux tends to
 * return only the loopback address (bug, security?), but not on Windows.
 */
public class LocalAddress
{    
  /**
   * Return an address of a non-loopback interface on the local host
   * 
   * @return address
   *         the InetAddress of the local host
   */
  public static InetAddress getLocalAddress()
  {
    InetAddress addr = null;    
    try
    {
      addr = InetAddress.getLocalHost();
      // OK - is this the loopback addr ?
      if ( ! addr.isLoopbackAddress() )
      {
        return addr;
      }
      // plan B - enumerate the network interfaces
      Enumeration ifaces = NetworkInterface.getNetworkInterfaces();
      while( ifaces.hasMoreElements() )
      {
        NetworkInterface netIf = (NetworkInterface)ifaces.nextElement();
        Enumeration addrs = netIf.getInetAddresses();
        while( addrs.hasMoreElements() )
        {
          addr = (InetAddress)addrs.nextElement();
          //System.out.println( "enum: " + addr.getHostAddress() );
          if ( addr instanceof Inet6Address )
          {
            // probably not what we want - keep looking
            continue;
          }
          // chose (arbitrarily?) first non-loopback addr
          if ( ! addr.isLoopbackAddress() )
          {
            return addr;
          }
        }
      }
      // nothing so far - last resort
      return getReflectedAddress();
    }
    catch ( UnknownHostException uhE )
    {
      // deal with this
    }
    catch ( SocketException sockE )
    {
      // can deal?
    }
    
    return null;
  }
  
  // get the address a server sees when you make a request
  // 'whatismyip.org' style resolution
  private static InetAddress getReflectedAddress()
  {
    // RLR TODO - this will be a standard homerun service
    // but need to encypt or obfuscate to prevent abuse
    return null;
  }
  
  public static void main(String[] args)
  {
    System.out.println( "OS: " + System.getProperty( "os.name" ) +
                    " vsn: " + System.getProperty( "os.version" ) +
                    " on: " + System.getProperty( "os.arch" ) );
    InetAddress local =  getLocalAddress();
    if ( local != null )
    {
      System.out.println( "localAddress: " + local.getHostAddress() );
    }
    else
    {
      System.out.println( "localAddress not found" );
    }
  }
}