Actualmente estoy buscando una forma portátil de obtener las direcciones IP locales. Debido a que estoy usando Boost de todos modos, pensé que sería una buena idea usar Boost.Asio para esta tarea.Obtener dirección IP local usando Boost.Asio
Hay varios ejemplos en la red que deberían ser el truco. Ejemplos:
Official Boost.Asio Documentation
me trataron ambos códigos con solo ligeras modificaciones. El código en Boost.Doc fue cambiado 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 era una fusión de los ejemplos anteriores y mi (pequeño) conocimiento que recopilé de la Documentación de Boost y otros ejemplos.
Todas las fuentes trabajadas, sino que se limitaron a devolver el siguiente IP:
127.0.1.1 (Eso no es un error tipográfico, su .1.1 al final)
corro y compilan el código en Ubuntu 9.10 con GCC 4.4 0.1
un colega intentó el mismo código en su máquina y se
127.0.0.2 (no es un error demasiado ...)
Se compila y ejecuta en Suse 11.0 con GCC 4.4.1 (no estoy 100% seguro)
No sé si es posible cambiar el localhost (1 27.0.0.1), pero sé que ni mi compañero ni yo lo hicimos. ifconfig dice que 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)
¿Esto es un problema de Linux y el código no es tan portátil como pensaba? ¿Tengo que cambiar algo más o Boost.Asio no funciona como una solución para mi problema en absoluto?
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 si pudieras señalarlo.
PS: Este es el código modificado he usado desde 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;
}
AFAIK, ASIO no proporciona una manera de enumerar las interfaces de su máquina (SIOCGIFCONF ioctl en Linux o GetAdaptersAddresses en Windows), que es, aparentemente, lo que está buscando. El código que muestra consulta el DNS con el nombre de host de su máquina, que no es lo mismo, y es menos robusto ya que depende más de la configuración de su red (en particular, el DNS tiene que "conocer" el nombre de su máquina). –
¿Asio :: ip :: address_v4 :: loopback() satisface sus necesidades? – yanpas