Получить локальный IP-адрес с помощью Boost.Asio - PullRequest
30 голосов
/ 20 апреля 2010

В настоящее время я ищу портативный способ получения локальных 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;
}

Ответы [ 3 ]

7 голосов
/ 11 января 2012

Вот трюк, который я узнал из сетевого программирования Python (Google), чтобы выяснить IP-адрес моей машины. Это работает только в том случае, если у вас есть подключение к Интернету и вы можете подключиться к google.com, и у меня есть личный адрес 192.168.x.x моей домашней машины.

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;

 }
5 голосов
/ 28 октября 2013

Вы можете найти «ваш» адрес с кодом, который вы разместили. НО ... это становится сложным. Может быть несколько сетевых карт, могут быть адреса LAN и WAN, проводные и беспроводные, петлевые ... На моем рабочем столе у ​​меня был один сетевой адаптер, но два ips здесь с двух серверов DHCP diff на моей локальной сети ...

Я обнаружил, что было лучше разрешить пользователю указывать IP-адрес для привязки в качестве параметра командной строки. И да, это портативное решение! : -)

4 голосов
/ 08 июня 2010

Если вы редактируете свой файл / etc / hosts (это только * nix, может работать и для Windows ... Я не уверен), вы можете исправить эту проблему.

Внутри файла hosts вы найдете что-то вроде: (это Ubuntu, обратите внимание на 1.1)

127.0.0.1 localhost
127.0.1.1 yourPcName.yourNetwork.tld

если вы измените этот файл на

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

тогда имя хоста должно разрешиться правильно.

Один из способов проверки правильности разрешения - использовать команду «hostname -i», которая должна неправильно печатать ваш IP-адрес перед сменой хостов, а затем корректно после.

Конечно, это ужасное решение для динамических IP-адресов ... эх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...