#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/
Комментариев нет:
Отправить комментарий