如何使用 boost::asio 将 URL 转换为 IP 地址?
Posted
技术标签:
【中文标题】如何使用 boost::asio 将 URL 转换为 IP 地址?【英文标题】:How to turn URL into IP address using boost::asio? 【发布时间】:2011-07-26 01:26:24 【问题描述】:所以我需要某种方法将给定的Protocol://URLorIP:Port
字符串转换为字符串ip
int port
如何使用 boost ASIO 和 Boost Regex 做这样的事情?或者是否有可能 - 使用C++ Net Lib (增强候选)获取 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?
【问题讨论】:
基本上,您首先需要解析您的协议字符串(与其含义无关),然后,一旦您拥有主机部分,您就必须执行名称解析(我会使用getaddrinfo
) .由于我不了解 boost ASIO,因此我不会将此作为答案,而仅作为建议。
【参考方案1】:
请记住,任何一个主机名都可能有多个 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
PS:作为参考,我打了电话
TCP 解析器的constructor 查询的host/service constructor 的无关服务值为""
抛出异常form of resolve()
dereferenced the iterator 获取解析器条目
使用 resolver_entry 的 type conversion to endpoint
使用了 TCP 端点的address() accessor
使用operator<< 显示地址:如果需要,您可以改用to_string()。
【讨论】:
以上是关于如何使用 boost::asio 将 URL 转换为 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
在 Boost.Asio 中同时使用 SSL 套接字和非 SSL 套接字?