Obtenez L'adresse IP locale en utilisant Boost.Asio
je suis actuellement à la recherche d'un moyen portable pour obtenir les adresses IP locales. Parce que J'utilise Boost de toute façon, j'ai pensé que ce serait une bonne idée d'utiliser Boost.Asio pour cette tâche.
Il y a plusieurs exemples sur le net qui devrait faire l'affaire. Exemples:
Boost Officiel.Asio Documentation
Les Asiatiques De La Page
j'ai essayé les deux codes avec de légères modifications. Le Code sur Boost.Doc a été changé pour ne pas résoudre "www.boost.org" mais "localhost" ou mon nom d'hôte au lieu. Pour obtenir le nom d'hôte, j'ai utilisé boost:: asio:: ip:: host_name () ou je l'ai tapé directement sous forme de chaîne.
En outre, j'ai écrit mon propre code qui était une fusion des exemples ci-dessus et de mes (peu) connaissances que j'ai recueillies à partir de la Documentation de Boost et d'autres exemples.
Toutes les sources travaillé, mais ils n'ont juste retour de l'IP suivante:
127.0.1.1 (ce n'est pas une faute de frappe, son .1.1 à l' fin)
J'exécute 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 a 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 mon collègue ne l'ont fait. ifconfig dit que loopback utilise 127.0.0.1. ifconfig aussi trouve L'IP publique que je cherche (141200.182.30 dans mon cas, subnet est 255.255.0.0)
alors C'est un problème Linux et le code n'est pas aussi portable que je le pensais? Est-ce que je dois changer quelque chose d'autre ou est Boost.Asio ne travaille pas du tout pour résoudre 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 peux pas trouver l'information qui est utile dans mon cas. Si vous avez des liens utiles, il serait bien si vous pouviez point de moi.
PS: Voici le code modifié que J'ai utilisé de 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;
}
3 réponses
voici un truc que j'ai appris de la programmation réseau de python (google) pour comprendre l'adresse ip de ma machine. Cela ne fonctionne que si vous avez une connexion internet et pouvez vous connecter à google.com et il me donne ma machine 192.168.x.x adresse privée.
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... cela devient compliqué. Il peut y avoir plusieurs NIC, il peut y avoir des adresses LAN et WAN, câblées et sans fil, loopback... Sur mon bureau, j'avais un NIC mais deux ips provenant de deux serveurs DHCP diff sur mon lan...
j'ai trouvé qu'il était préférable de laisser l'Utilisateur fournir L'IP à laquelle se connecter en tant que paramètre de ligne de commande. Et oui, c'est une solution portable! : -)
Si vous modifiez votre fichier /etc/hosts (c'est *nix seulement, pourrait fonctionner pour windows... Je ne suis pas sûr) vous pouvez corriger cette question.
dans le fichier hosts vous trouverez quelque chose comme: (C'est Ubuntu, notez le 1.1)
127.0.0.1 localhost
127.0.1.1 yourPcName.yourNetwork.tld
si vous modifiez ce fichier
127.0.0.1 localhost
127.0.1.1 yourPcName.yourNetwork.tld
votre.réel.IP.ici yourPcName
alors le nom d'hôte doit résoudre correctement.
une méthode pour tester la bonne résolution est la commande "nom d'hôte-i" qui devrait imprimer votre adresse ip de manière incorrecte avant de changer d'hôte, puis correctement après.
bien sûr c'est une très mauvaise solution pour les adresses ip dynamiques... eh.