[英]resolve function doesn't work in boost/asio
I am learning boost/asio and writing example program which was in e-book.我正在学习 boost/asio 并编写电子书中的示例程序。 of course it didn't work ;)
当然没有用;)
#include <boost/asio.hpp>
#include <iostream>
int main () {
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver::query query("www.boost.org", "http");
boost::asio::ip::tcp::resolver::iterator destination = boost::asio::ip::tcp::resolver::resolve(query); // if i have "." before "resolve" as in books example compilers says i need primary-expresion.
boost::asio::ip::tcp::endpoint endpoint;
while ( destination != end ) {
endpoint = *destination++;
std::cout<<endpoint<<std::endl;
}
boost::asio::ip::tcp::socket socket(io_service);
socket.connect(endpoint);
return 0;
}
compiler output with "::" before "resolve": “解析”前带有“::”的编译器输出:
/home/martins/C++/boost_asio_client/client.cpp|7|error: cannot call member function
‘boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::iterator
boost::asio::ip::basic_resolver<InternetProtocol,
ResolverService>::resolve(boost::asio::ip::basic_resolver<InternetProtocol,
ResolverService>::query&)
[with InternetProtocol = boost::asio::ip::tcp, ResolverService =
boost::asio::ip::resolver_service<boost::asio::ip::tcp>,
boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::iterator =
boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>,
boost::asio::ip::basic_resolver<InternetProtocol, ResolverService>::query =
boost::asio::ip::basic_resolver_query<boost::asio::ip::tcp>]’ without object|
How do I resolve address correctly?如何正确解析地址?
you need a resolver
object.你需要一个
resolver
对象。 Also your iterator comparison was incorrect, you need to compare against the sentinel value ip::tcp::resolver::iterator()
.此外,您的迭代器比较不正确,您需要与哨兵值
ip::tcp::resolver::iterator()
。
#include <boost/asio.hpp>
#include <iostream>
int main () {
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver::query query("www.boost.org", "http");
boost::asio::ip::tcp::resolver resolver( io_service );
boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query);
boost::asio::ip::tcp::endpoint endpoint;
while ( destination != boost::asio::ip::tcp::resolver::iterator() ) {
endpoint = *destination++;
std::cout<<endpoint<<std::endl;
}
boost::asio::ip::tcp::socket socket(io_service);
socket.connect(endpoint);
return 0;
}
here is a sample compile and run of your code.这是您的代码的示例编译和运行。
samm@macmini ~> g++ -lboost_system resolve.cc
samm@macmini ~> ./a.out
129.79.245.252:80
samm@macmini ~> echo $?
0
samm@macmini ~>
resolve
isn't a static member function, so you need to create a resolver object, and then invoke the member function on that object, something like (going from memory, so don't hold me to this being anywhere close to perfect): resolve
不是静态成员函数,因此您需要创建一个解析器对象,然后调用该对象上的成员函数,例如(从内存中获取,所以不要让我认为这是接近完美的任何地方):
int main () {
boost::asio::io_service io_service; // existing
boost::asio::ip::tcp::resolver::query query("www.boost.org", "http"); // existing
boost::asio::ip::tcp::resolver resolver(io_service); // added
// modified to use object defined above:
boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.