Как превратить URL-адрес в IP-адрес с помощью boost::asio?
-
14-11-2019 - |
Вопрос
Поэтому мне нужен какой-то способ превратить данный Protocol://URLorIP:Port
строка в строку ip
интервал port
Как это сделать с помощью Boost ASIO и Boost Regex?Или можно - получить IP с помощью Сетевая библиотека С++ (кандидат в буст) - заметьте - нам не нужно долгое соединение - только IP.
Поэтому в настоящее время я использую такой код для анализа
#include <boost/regex.hpp>
#include <vector>
#include <string>
int main(int argc, char** argv)
{
if (argc < 2) return 0;
std::vector<std::string> values;
boost::regex expression(
// proto host port
"^(\?:([^:/\?#]+)://)\?(\\w+[^/\?#:]*)(\?::(\\d+))\?"
// path file parameters
"(/\?(\?:[^\?#/]*/)*)\?([^\?#]*)\?(\\\?(.*))\?"
);
std::string src(argv[1]);
if (boost::regex_split(std::back_inserter(values), src, expression))
{
const char* names[] = {"Protocol", "Host", "Port", "Path", "File",
"Parameters", NULL};
for (int i = 0; names[i]; i++)
printf("%s: %s\n", names[i], values[i].c_str());
}
return 0;
}
Что мне добавить в мою небольшую программу для преобразования URL в IP?
Решение
Помните, что для одного имени хоста может быть несколько IP-адресов, boost предоставляет вам итератор, который будет проходить через них.
Использование довольно простое, добавьте это перед return 0;
вашей программы:
std::cout << "IP addresses: \n";
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(values[1], "");
for(boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);
i != boost::asio::ip::tcp::resolver::iterator();
++i)
{
boost::asio::ip::tcp::endpoint end = *i;
std::cout << end.address() << ' ';
}
std::cout << '\n';
и не забывай #include <boost/asio.hpp>
тестовый забег:
~ $ g++ -g -Wall -Wextra -pedantic -Wconversion -ansi -o test test.cc -lboost_regex -lboost_system -lboost_thread
~ $ ./test http://www.google.com:7777
Protocol: http
Host: www.google.com
Port: 7777
Path:
File:
Parameters:
IP addresses:
74.125.226.179 74.125.226.176 74.125.226.178 74.125.226.177 74.125.226.180
ПС:Для справки я позвонил
- TCP-резольвер конструктор
- запрос конструктор хоста/сервиса с наплевательской стоимостью услуги
""
- выбрасывание исключений форма решения()
- разыменовал итератор чтобы получить запись преобразователя
- использовал resolver_entry преобразование типа в конечную точку
- использовал конечную точку TCP метод доступа адрес()
- использовал оператор<< чтобы показать адрес:ты мог бы использовать нанизывать() вместо этого, если необходимо.
Не связан с StackOverflow