2011-02-24 55 views
14

我以C++中的boost asio编程开始,并且在查看示例时我无法理解boost::asio::ip::tcp::resolver::iterator做什么。boost :: asio :: ip :: tcp :: resolver :: iterator是做什么的?

代码:

boost::asio::io_service io_service; 

tcp::resolver resolver(io_service); 
tcp::resolver::query query(argv[1]); 
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
tcp::resolver::iterator end; 

tcp::socket socket(io_service); 
boost::system::error_code error = boost::asio::error::host_not_found; 
while (error && endpoint_iterator != end) 
{ 
    socket.close(); 
    socket.connect(*endpoint_iterator++, error); 
} 

请帮助我,原谅我,如果我的问题并没有提供足够的信息。

+2

得爱boost.asio命名空间。 * barf * – Inverse 2011-02-25 05:57:00

+0

供参考:查询仅适用于服务。如果您正在寻找某个服务的特定主机,则需要向tcp :: resolver :: query ctor添加另一个参数。 – 2014-10-15 21:43:53

回答

19

boost::asio::ip::tcp::resolver::iterator迭代通过您指定的主机的地址列表(主机可以有多个地址)。

和std :: string :: iterator一样迭代其字符,boost :: asio :: ip :: tcp :: resolver :: iterator遍历其地址列表。

下面的代码:

while (error && endpoint_iterator != end) 
{ 
    socket.close(); 
    socket.connect(*endpoint_iterator++, error); 
} 

尝试直到成功或耗尽端点建立到每个端点的连接(感谢你的更正尤金·康斯坦丁丁加)。

+2

实际上'while'会尝试连接到每个端点,直到成功或端点用完。所以最多1个端点将在循环结束时连接。 – 2011-02-24 22:15:14

+0

为什么它使用* endpoint_iterator ++而不是endpoint_iterator ++?你为什么需要指针? – Hami 2011-02-25 22:18:45

+5

@Hami'ip :: tcp :: resolver :: iterator'不是一个指针,它的外观和行为就像一个。后缀增量运算符('operator ++(int)')在间接运算符('operator *()')获得底层'endpoint'并将其返回给'socket :: connect()'后,获得下一个迭代器**。 。如果连接失败,则设置“错误”并继续循环。这些是标准模板库中迭代器使用的相同概念。 – 2011-02-26 17:22:10

相关问题