views:

1419

answers:

2

I would like to determine the local IP adress from my java applet. The problem is when there are several IP adresses on the same machine, which has LAN and internet connections (palm, VMWare...).

Here is my test :

    public static void main(String[] args) {
      try {
        String hostName = InetAddress.getLocalHost().getHostName();
        System.out.println("HostName = " + hostName);
        System.out.println("HostAddressLocal = " +
          InetAddress.getLocalHost().getHostAddress());
        InetAddress[] inetAddresses = InetAddress.getAllByName(hostName);
        for (InetAddress inetAddress : inetAddresses) {
          System.out.println("hostAddress = " + inetAddress.getHostAddress());
        }
      } catch (Exception e) {
          e.printStackTrace();
      }
    }

The result is :

    HostName = xxxx
    HostAddressLocal = xx.xx.xx.xx
    hostAddress = 10.10.11.51
    hostAddress = 192.168.23.1
    hostAddress = 192.168.106.1

where xx.xx.xx.xx isn't the correct adress. The correct is 10.10.11.51.


EDIT in response to jarnbjo :

Your crystal ball say the truth. You've understand my problem. The client can connect through a proxy so I can not use your first point. If I execute this code below on my computer :

    Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close();

I have this result :

    Internet IP = /127.0.0.1

And not 10.10.11.51

A: 

In bottom of getHostName() C function gethostbyname(). They initially looking to /etc/hosts, then try resolve through DNS. So, if you add 10.10.11.51 myhostname to /etc/hosts getHostName() should detect it correctly In windows there is analogue to /etc/hosts, AFAIR in \WINDOWS\System32\Servises or so...

This is ONLY name resolution problem.

In your code you first get host name (hostName = InetAddress.getLocalHost().getHostName();) this function return your computer name setted when installing system was installed. Then you get all IP of concrete host name (InetAddress.getAllByName(hostName)) - this return all IP resolved for this hostname

Simple example

1 /etc/hosts like this

127.0.0.1   localhost
127.0.1.1   fred-desktop

your code return

HostName = fred-desktop
HostAddressLocal = 127.0.1.1
hostAddress = 127.0.1.1

2 change /etc/hosts to look like

127.0.0.1   localhost
127.0.1.1   fred-desktop
192.168.1.1 fred-desktop
20.20.20.20 fred-desktop

your code will return

HostName = fred-desktop
HostAddressLocal = 127.0.1.1
hostAddress = 127.0.1.1
hostAddress = 192.168.1.1
hostAddress = 20.20.20.20

fred-desktop - name of my ubuntu box.

Alexey Sviridov
That was not the question. The problem is not name resolution, but the fact that there may be multiple interfaces.
sleske
Very bad voting down even not pay attention to answer...
Alexey Sviridov
The question is for Java and you give a C call for a different purpose
Mark
@mark - you completely don't understand what i'm saying... InetAddress.getAllByName(hostName) - return IP for host by name resolution, not by PHISICAL interfaces of this host. It's not correct way to get interfaces of local machine
Alexey Sviridov
+4  A: 

As you've already discovered, a computer may very well have several network interfaces with different IP addresses and it's a little bit difficult to guess which one you consider to be "correct", as they are all actually correct.

My crystal ball suggest me that you mean the IP address, which the client is using to connect to the server, from which the applet was loaded. If so, you have at least two possibilities:

  • On the server, you can embed the applet on a dynamically generated HTML page and add the client's IP address as an applet parameter. At least if you're not doing HTTP over a proxy, the web server should be able to determine the client's IP address and pass it on to the applet.

  • In the applet, you can open a TCP socket to the web server from which you loaded the applet and check which local address is being used for the connection:

.

Socket s = new Socket("www", 80);
InetAddress ip = s.getLocalAddress();
s.close();
jarnbjo
Thanks a lot! See my edit in the question.
EFalco