Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Как узнать ip “белый” или нет?

#boost #cpp

                    
Нужно программно определить является ли ip "белым". Какие программные пути для этого
существуют? Не знаю может я все усложнил, но поискав, пришел к трем вариантам:

1) Узнать локальный ip, и распрасив его, узнать не попадает ли он под локальный диапазон

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
127.0.0.0/8


Локальный ip определятся так:

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::host_name(), "");
boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(query);
boost::asio::ip::tcp::endpoint endpoint = *it;
std::cout << endpoint.address().to_string() << '\n';


Является ли этот способ универсальным для всех видов (большинства) подключений к
Интернет?

2) Узнать еще и внешний ip и сравнить его с локальным.

3) И последний способ. Этот код я скачал с stackoverflow:

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;

 }


здесь насколько мне говорит мой английский - подключение возможно только в том случаи
если у меня "белый" ip. И если подключения будет удачным - то ip "белый". Правильно
ли я понял? И какой вариант выбрать? 

Трудность заключается в том, что я не знаю как тестировать. Ведь для этого необходим
белый ip, чтобы попеременно запускать программу и смотреть что да и как работает.
    


Ответы

Ответ 1



Просто отбросит все локальные адреса -> 3. Сообщит Вам - внешний айпи если подключение сотоится. Вот тот, внешний айпи может быть как серым(NAT) так и - белым(BI-NAT). Отличие в том, будет ли Ваша машина "видна" по этому адресу из интернет. А для того чтоб это проверить - надо чтобы удалённое устройство послало пакет на открытый на вашей машине порт. И этот пакет должен успешно дойти. Увы, я не знаю операторов которые предлагают апи для отправки пакетов. Но есть вебсайты которые могут просканировать заданный порт. Разумеется, надо открыть этот порт и ждать на него пакета. К примеру: http://www.yougetsignal.com/tools/open-ports/

Комментариев нет:

Отправить комментарий