В настоящее время я ищу портативный способ получения локальных IP-адресов. Поскольку я все равно использую Boost, я подумал, что было бы неплохо использовать Boost.Asio для этой задачи.
В сети есть несколько примеров, которые должны помочь. Примеры:
Официальная документация Boost.Asio
Азиатская страница
Я пробовал оба кода с небольшими изменениями. Код в Boost.Doc был изменен, чтобы вместо него разрешать не «www.boost.org», а «localhost» или мое имя хоста. Для получения имени хоста я использовал boost :: asio :: ip :: host_name () или набрал его непосредственно в виде строки.
Кроме того, я написал свой собственный код, который был объединением вышеприведенных примеров и моих (небольших) знаний, которые я собрал из документации Boost и других примеров.
Все источники работали, но они просто возвращали следующий IP:
127.0.1.1 (это не опечатка, его .1.1 в конце)
Я запускаю и компилирую код на Ubuntu 9.10 с GCC 4.4.1
Коллега попробовал тот же код на своей машине и получил
127.0.0.2 (тоже не опечатка ...)
Он скомпилировал и запустил Suse 11.0 с GCC 4.4.1 (я не уверен на 100%)
Я не знаю, возможно ли изменить локальный хост (127.0.0.1), но я знаю, что ни я, ни мой коллега этого не сделали. ifconfig говорит, что loopback использует 127.0.0.1. ifconfig также находит общедоступный IP-адрес, который я ищу (в моем случае 141.200.182.30, подсеть 255.255.0.0)
Так это проблема Linux, а код не такой переносимый, как я думал? Нужно ли что-то менять или Boost.Asio вообще не работает как решение моей проблемы?
Я знаю, что есть много вопросов о похожих темах на Stackoverflow и других страницах, но я не могу найти информацию, которая пригодится в моем случае. Если бы вы получили полезные ссылки, было бы неплохо, если бы вы указали мне на это.
PS:
Вот модифицированный код, который я использовал из 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;
}