所以我需要一些方法来将给定的 Protocol://URLorIP:Port 字符串转换成字符串 ip port 如何用boost ASIO和Boost Regex来做这样的事情?或者有没有可能-使用 C++ Net Lib (boost候选)获得IP -注意-我们不需要长连接-仅IP。
Protocol://URLorIP:Port
ip
port
因此,我目前使用这样的代码来解析
#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?
发布于 2011-03-30 20:57:23
请记住,任何一个主机名都可能有多个IP地址,boost会提供一个迭代器来遍历这些地址。
用法相当简单,在程序的 return 0; 之前添加以下内容:
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(); boost::asio::ip::tcp::endpoint end = *i; std::cout << end.address() << ' '; std::cout << '\n';
别忘了 #include <boost/asio.hpp>
#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: