所以我需要某种转向方式Protocol://URLorIP:Port
串入串ip
int port
如何使用 boost ASIO 和 Boost Regex 来做这样的事情?或者是否有可能 - 使用获取 IPC++ 网络库 http://cpp-netlib.github.com/(增强候选者) - 注意 - 我们不需要长连接 - 只需 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
PS:仅供参考,我打电话过
- TCP 解析器构造函数 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_resolver/basic_resolver.html
- query's 主机/服务构造函数 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_resolver_query/basic_resolver_query/overload3.html无关服务价值为
""
- 异常抛出解析()的形式 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_resolver/resolve/overload1.html
-
取消引用迭代器 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_resolver_iterator/operator__star_.html获取解析器条目
- 使用resolver_entry的类型转换为端点 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_resolver_entry/operator_endpoint_type.html
- 使用 TCP 端点的地址()访问器 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__basic_endpoint/address/overload1.html
- used 运算符显示地址:您可以使用 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__address_v4/operator_lt__lt_.htmlto_string() http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/reference/ip__address_v4/to_string/overload1.html相反,如果需要的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)