Comme la machine peut avoir plusieurs adresses, il est difficile de déterminer laquelle est la bonne pour vous. Normalement, vous souhaitez que le système attribue une IP en fonction de sa table de routage. Comme le résultat dépend de l'IP à laquelle vous souhaitez vous connecter, il existe une astuce simple : il suffit de créer une connexion et de voir quelle adresse le système d'exploitation vous a donnée :
// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());
Je ne suis pas sûr qu'il soit possible de le faire sans établir de connexion. Je pense avoir déjà réussi à le faire avec Perl (ou C ?), mais ne me demandez pas ce qu'il en est de Java. Je pense qu'il est possible de créer une socket UDP (DatagramSocket) sans la connecter.
Si un routeur NAT se trouve sur le chemin, vous ne pourrez pas obtenir l'adresse IP que les hôtes distants verront. Cependant, comme vous avez donné 192.* comme exemple, je pense que vous ne vous en souciez pas.
1 votes
Dans mon Windows, System.out.println(InetAddress.getLocalHost().getHostAddress()) ; imprime 10.50.16.136
0 votes
Intéressant ... réponse correcte bien qu'elle ne fonctionne pas ?
0 votes
C'est très courant sur l'OS, la réponse incorrecte est marquée comme répondue.
2 votes
@sfussenegger 127.0.1.1 est un truc de Debian (dont Ubuntu est dérivé). IIRC, vous l'obtiendrez si vous utilisez DHCP. Cela permet de signaler une adresse IP fixe (je crois que c'est nécessaire pour le bon fonctionnement de GNOME). Donc 127.0.1.1 est une adresse "IP réelle". (BTW : 192.168.* est une adresse IP non-internet).
0 votes
@tom oui, je sais ce que c'est. Je me demande juste en quoi c'est la réponse correcte à la question ("J'ai besoin de connaître l'ip réelle de ma machine sur le réseau").
0 votes
@sfussenegger le réel La réponse serait de trouver un moyen de demander les adresses de chaque interface réseau. Je ne connais pas de moyen de faire cela en Java, mais c'est ainsi que je le fais en C.
0 votes
@jdizzle Pourquoi serait-ce la vraie réponse ? La question était de savoir comment déterminer "l'IP réelle de ma machine sur le réseau". En quoi une liste d'IP est-elle utile pour répondre à cette question qui stipule qu'il n'y a d'intérêt que pour une IP utilisée pour un réseau spécifique ?
0 votes
@sfussenegger un hôte peut avoir plusieurs interfaces et chaque interface peut avoir plusieurs IP. Il est juste typique qu'un hôte n'ait que quelques interfaces (par exemple eth0, lo) et il est aussi typique que chaque interface n'ait qu'une seule IP. Chaque IP est tout aussi "réelle" que la suivante. La seule façon de savoir quelle IP vous voulez est de savoir à qui vous voulez parler et de regarder la table de routage. C'est pourquoi le piratage de google.com ci-dessous est presque bon, mais, comme il laisse échapper des informations (requêtes DNS et connexions erronées) et qu'il est juste un peu bizarre, je le considère comme imparfait.
0 votes
@jdizzle Je suis tout à fait d'accord. J'ai déjà fait quelque chose de similaire en créant un packat UDP sans l'envoyer réellement. Je pense que c'était en C (mais peut-être en Perl), où il était possible de lire l'adresse source. Malheureusement, je ne pense pas que cela soit possible en Java (DatagramPacket ne propose même pas de méthode getSourceAddress() ou similaire). J'ai modifié mon exemple pour ne pas utiliser le DNS.
0 votes
Je comprends qui est perplexe à l'idée que je donne une réponse correcte à cette question. C'est probablement parce que j'étais plus intéressé par les résultats de cet appel que par la méthode réelle d'obtention de l'IP (bien sûr, je sais que je dois lister les interfaces... mais je voulais un moyen rapide et sale). @Tom Hawtin : L'adresse IP réelle peut signifier plusieurs choses... Je voulais dire l'adresse INTERFACE, quelqu'un a compris une adresse TRANSFRONTÉE. 192.168.* sont de VRAIES adresses IP mais elles sont réservées à un usage LAN. RTM. Merci à tous et désolé pour cette question sans intérêt.