В настоящее время я ищу портативный способ получения локальных 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%)
Я не знаю, можно ли изменить localhost (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;
}