/**
* 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" );
}
}
}