LocalAddress.java Source code

Java tutorial

Introduction

Here is the source code for LocalAddress.java

Source

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