tags:

views:

584

answers:

6

This code used to return my local ip address as 192.xxx.x.xxx but now it is returning 127.0.0.1 . Please help me why the same code is returning different value. Is there something that I need to watch at linux OS.

import java.util.*;
import java.lang.*;
import java.net.*;

public class GetOwnIP
{
  public static void main(String args[]) {
    try{
      InetAddress ownIP=InetAddress.getLocalHost();
      System.out.println("IP of my system is := "+ownIP.getHostAddress());
    }catch (Exception e){
      System.out.println("Exception caught ="+e.getMessage());
    }
  }
}
+8  A: 

127.0.0.1 is the loopback adapter - it's a perfectly correct response to the (somewhat malfomed) question "what is my IP address?"

The problem is that there are multiple correct answers to that question.

EDIT: The docs for getLocalHost say:

If there is a security manager, its checkConnect method is called with the local host name and -1 as its arguments to see if the operation is allowed. If the operation is not allowed, an InetAddress representing the loopback address is returned.

Is it possible that the change in behaviour is due to a change in permissions?

EDIT: I believe that NetworkInterface.getNetworkInterfaces is what you need to enumerate all the possibilities. Here's an example which doesn't show virtual addresses, but works for "main" interfaces:

import java.net.*;
import java.util.*;

public class Test
{
    public static void main(String[] args)
        throws Exception // Just for simplicity
    {
        for (Enumeration<NetworkInterface> ifaces = 
               NetworkInterface.getNetworkInterfaces();
             ifaces.hasMoreElements(); )
        {
            NetworkInterface iface = ifaces.nextElement();
            System.out.println(iface.getName() + ":");
            for (Enumeration<InetAddress> addresses =
                   iface.getInetAddresses();
                 addresses.hasMoreElements(); )
            {
                InetAddress address = addresses.nextElement();
                System.out.println("  " + address);
            }
        }
    }
}

(I'd forgotten just how awful the Enumeration<T> type is to work with directly!)

Here are the results on my laptop right now:

lo:
  /127.0.0.1
eth0:
  /169.254.148.66
eth1:
eth2:
ppp0:
  /10.54.251.111

(I don't think that's giving away any hugely sensitive information :)

If you know which network interface you want to use, call NetworkInterface.getByName(...) and then look at the addresses for that interface (as shown in the code above).

Jon Skeet
In the loop above, you could also simply skip over the loopback by checking NetworkInterface#isLoopback().
omerkudat
Why is there a slash before the IP address?
Matías
+3  A: 

When you use InetAddress.getLocalHost() you are not guaranteed to get a particular interface, ie. you could receive the loopback (127) interface or a connected one.

In order to ensure you always get an external interface, you should use the java.net.NetworkInterface class. The static getByName(String) class will give you the interface with the defined name (such as "eth0"). Then you can use the getInetAddresses() function to obtain the IP addresses (could be just one) bound to that interface.

NetworkInterface ni = NetworkInterface.getByName("eth1");
ni.getInetAddresses();
omerkudat
+2  A: 

Check your /etc/host file. If you put 127.0.0.1 first, it will return this as result.

The correct way to get the ip address is to use NetworkInterface.getNetworkInterfaces() and run getInetAddresses() on each of them.

J-16 SDiZ
A: 

This is because you have a line in /etc/hosts like 127.0.0.1 localhost you need to have 192.xxx.xxx.xxx localhost

Though please note that this would be very bad as to solve a code issue you should not modify linux config files. Not only is it not right (and risks breaking some other network aware apps on your linux box) it will also not work anywhere else (unless the admins of those boxes are also like minded).

javadoc for InetAddress.getLocalHost(); read "....an InetAddress representing the loopback address is returned." so it appears that the implementation of getLocalHost() is incorrect on your UNIX and WIN boxes. The loopback address is nearly allways 127.0.0.1

Found this comment "A host may have several IP addresses and other hosts may have to use different addresses to reach it. E.g. hosts on the intranet may have to use 192.168.0.100, but external machines may have to use 65.123.66.124. If you have a socket connection to another host you can call Socket.getLocalAddress() to find out which local address is used for the socket."

Priyank
A: 

You can use the NetworkInterface.getNetworkInterfaces() method to retrieve an Enumeration of all of the network interfaces for your system.

For each of the NetworkInterface instances, you can then use the getInetAddresses() method to retrieve an Enumeration of all of the InetAddress instances associated with the network interface.

Finally, you can use the getHostAddress() method on each InetAddress instance to retrieve the IP address in textual form.

Brandon E Taylor
A: 

I have the same question - and thanks for your solution, but unfortunately it does not seem to be working for me.

I'm also working on the Windows OS, not Linux, so it is possible that results vary from those stated here.

I'm using the Network Interface code on Java 6 to get my workstation's IP address (on Windows OS). It gives the following results:

lo: /127.0.0.1

eth0:

The address of the eth0 interface is blank. When I run the same code on Java 4, it gives me the workstation's IP as the eth0 address. I cannot figure out why this is happening, and I'm alos looking for a way to get my machine's IP. Any ideas?

Thanks for all the help through this post!

Christiena

Christiena