¿Cómo convertir la URL en la dirección IP usando BOOST :: ASIO?
-
14-11-2019 - |
Pregunta
Entonces, ¿necesito una forma de tornear la cadena de generación Protocol://URLorIP:Port
en la cadena ip
int port
¿Cómo hacer tal cosa con BOOST ASIO y BOOST REGEX?O es posible, para obtener IP utilizando C ++ net lib (Boost Candidate) - Aviso - lo hacemosNo necesita conexión larga - solo IP.
Así que actualmente uso dicho código para analizar
#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;
}
¿Qué agregaré a mi pequeño programa para analizar la URL en IP?
Solución
Recuerde que puede haber múltiples direcciones IP para cualquier nombre de host, Boost le brinda un iterador que los atravará.
El uso es bastante sencillo, agregue esto antes de return 0;
de su programa:
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';
y no olvides #include <boost/asio.hpp>
Ejecución de la prueba:
~ $ 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
PS: Para referencia, llamé
- TCP Resolución constructor
- consulta's constructor de host / servicio con un valor de servicio de no cuidado de
""
- El lanzamiento de excepciones forma de resolución ()
- Dereferenció el iterador para obtener un resolver Entrada
- usó resolver_entry's Tipo de conversión al punto final
- usó el TCP Endpoint's Dirección () Accessor
- usado Operador << para mostrar el Dirección: Puede usarla to_string () en su lugar, si es necesario.