Je cherche actuellement une façon portable d'obtenir les adresses IP locales. Parce que j'utilise Boost de toute façon, je pensais que ce serait une bonne idée d'utiliser Boost.Asio pour cette tâche.
Il existe plusieurs exemples sur le net qui devraient faire l'affaire. Exemples:
Documentation officielle Boost.Asio
J'ai essayé les deux codes avec de légères modifications. Le code sur Boost.doc a été modifié pour ne pas résoudre "www.boost.org" mais "localhost" ou mon nom d'hôte à la place. Pour obtenir le nom d'hôte, j'ai utilisé boost :: Asio :: IP :: hôte_name () ou le tapé directement sous forme de chaîne.
De plus, j'ai écrit mon propre code qui était une fusion des exemples ci-dessus et de mes connaissances (peu) que j'ai rassemblées de la documentation de Boost et d'autres exemples.
Toutes les sources fonctionnaient, mais elles ont juste retourné l'IP suivante:
127.0.1.1 (Ce n'est pas une faute de frappe, sa .1.1 à la fin)
[.____] Je cours et compilé le code sur Ubuntu 9.10 avec GCC 4.4.1
Un collègue a essayé le même code sur sa machine et obtenu
127.0.0.2 (pas une faute de frappe aussi ...)
[.____] Il a compilé et exécuté sur SUSE 11.0 avec GCC 4.4.1 (je ne suis pas sûr à 100%)
Je ne sais pas s'il est possible de changer le localhost (127.0.0.1), mais je sais que ni moi ni moi ni mon collègue l'a fait. IFCONFIG indique que le bouclage utilise 127.0.0.1. ifconfig trouve également l'IP publique que je recherche (141.200.182.30 dans mon cas, Subnet est 255.255.0.0)
Voilà-y un problème Linux et le code n'est pas aussi portable que je pensais? Dois-je changer autre chose ou est Boost.Asio ne fonctionne pas comme une solution pour mon problème?
Je sais qu'il y a beaucoup de questions sur des sujets similaires sur Stackoverflow et d'autres pages, mais je ne trouve pas de trouver des informations utiles dans mon cas. Si vous avez des liens utiles, ce serait bien si vous pouviez me diriger.
PS: Voici le code modifié que j'ai utilisé chez BOOST.DOC:
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::Host_name(), "");
tcp::resolver::iterator iter = resolver.resolve(query);
tcp::resolver::iterator end; // End marker.
while (iter != end)
{
tcp::endpoint ep = *iter++;
std::cout << ep << std::endl;
}
Voici une astuce que j'ai apprise de python programmation de réseau (Google) pour déterminer l'adresse IP de mon appareil. Cela ne fonctionne que si vous avez une connexion Internet et peut vous connecter à google.com et me donne mon Adresse privée de 192.168.xx de la machine à domicile.
try {
boost::asio::io_service netService;
udp::resolver resolver(netService);
udp::resolver::query query(udp::v4(), "google.com", "");
udp::resolver::iterator endpoints = resolver.resolve(query);
udp::endpoint ep = *endpoints;
udp::socket socket(netService);
socket.connect(ep);
boost::asio::ip::address addr = socket.local_endpoint().address();
std::cout << "My IP according to google is: " << addr.to_string() << std::endl;
} catch (std::exception& e){
std::cerr << "Could not deal with socket. Exception: " << e.what() << std::endl;
}
Vous pouvez trouver "votre" adresse avec le code que vous avez posté. Mais ... ça devient compliqué. Il peut y avoir plusieurs NICS, il peut y avoir une LAN et WAN adresses, filaire et sans fil, bouclack ... sur mon bureau j'en ai eu un NIC mais deux IPS Ici de deux serveurs DIFF DHCP sur mon réseau local ...
J'ai trouvé qu'il était préférable de laisser l'utilisateur fournir à l'adresse IP de se lier comme un paramètre de ligne de commande. Et oui, c'est une solution portable! :-)