c++ ip-address boost-asio

c++ - Obtener dirección IP local utilizando Boost.Asio



ip-address boost-asio (3)

Este es un truco que aprendí de la programación en red de python (google) para averiguar la dirección IP de mi máquina. Esto solo funciona si tiene una conexión a Internet y puede conectarse a google.com y me da la dirección privada 192.168.xx de mi máquina doméstica.

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; }

Actualmente estoy buscando una forma portátil de obtener las direcciones IP locales. Como de todos modos estoy usando Boost, pensé que sería una buena idea usar Boost.Asio para esta tarea.

Hay varios ejemplos en la red que deberían hacer el truco. Ejemplos:

Documentación oficial de Boost.Asio

Alguna página asiática

Intenté ambos códigos con ligeras modificaciones. El Código en Boost.Doc se cambió para no resolver "www.boost.org" sino "localhost" o mi nombre de host en su lugar. Para obtener el nombre de host utilicé boost :: asio :: ip :: host_name () o lo escribí directamente como una cadena.

Además, escribí mi propio código, que fue una combinación de los ejemplos anteriores y mi (poco) conocimiento que obtuve de la Documentación Boost y otros ejemplos.

Todas las fuentes funcionaron, pero solo devolvieron la siguiente IP:
127.0.1.1 (Eso no es un error tipográfico, es .1.1 al final)
Ejecuto y compilé el código en Ubuntu 9.10 con GCC 4.4.1

Un colega probó el mismo código en su máquina y consiguió
127.0.0.2 (No es un error tipográfico también ...)
Compiló y ejecutó en Suse 11.0 con GCC 4.4.1 (no estoy 100% seguro)

No sé si es posible cambiar el host local (127.0.0.1), pero sé que ni yo ni mi colega lo hicieron. ifconfig dice que el loopback usa 127.0.0.1. ifconfig también encuentra la IP pública que estoy buscando (141.200.182.30 en mi caso, la subred es 255.255.0.0)

Entonces, ¿esto es un problema de Linux y el código no es tan portátil como pensé? ¿Tengo que cambiar algo más o Boost.Asio no funciona como una solución para mi problema?

Sé que hay muchas preguntas sobre temas similares en Stackoverflow y otras páginas, pero no puedo encontrar información que sea útil en mi caso. Si tienes enlaces útiles, sería bueno que me indicaras.

PS: Aquí está el código modificado que usé 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; }


Puede encontrar "su" dirección con el código que publicó. PERO ... se complica. Puede haber varias NIC, puede haber direcciones de LAN y WAN, cableadas e inalámbricas, bucle de retorno ... En mi escritorio tengo una NIC, pero dos ips aquí desde dos servidores DHCP diferentes en mi lan ...

Descubrí que era mejor dejar que el usuario proporcionara la IP para enlazar como un parámetro de línea de comandos. Y sí, esa es una solución portátil! :-)


Si edita su archivo / etc / hosts (esto es solo * nix, también podría funcionar para Windows ... No estoy seguro) puede corregir este problema.

Dentro del archivo hosts encontrará algo como: (esto es Ubuntu, tenga en cuenta el 1.1)

127.0.0.1 localhost
127.0.1.1 yourPcName.yourNetwork.tld

si cambias este archivo a

127.0.0.1 localhost
127.0.1.1 yourPcName.yourNetwork.tld
your.real.ip.here yourPcName

entonces el nombre de host debe resolverse correctamente.

Un método para probar la resolución adecuada es con el comando "hostname -i", que debe imprimir su dirección IP de manera incorrecta antes de cambiar de host y, luego, correctamente.

Por supuesto, esta es una solución terrible para IP dinámicas ... eh.