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