socket.connect和boost::asio::connect之间的区别

14
我正在使用boost::asio进行网络通信,我想知道为什么示例中有时使用socket.connect(endpoint),而有些时候则使用boost::asio::connect(socket, endpoint)。根据代码boost::asio::connect会对端点迭代器循环调用socket.connect。所以我的问题是: 哪种行为更好?使用boost::asio::connect还是socket.connect?个人更喜欢socket.connect,因为我只有一个端点。或许我错了,误解了asio库。
此外,我的第二个问题是,为什么端点是迭代器?当给定1个IP和1个端口时,如何可能有多个连接?
另外,还有boost::asio::write和socket.write...
示例代码如下:
  1. boost::asio::connect(socket, endpoint) blocking_tcp_echo_client.cpp
  2. socket.connect(endpoint)(稍早但仍有效)Daytime.1
2个回答

17

boost::asio::connect()是一个更高级别的免费函数,它将调用boost::asio::ip::tcp::socket::connect()。这里的文档相当清晰。

此函数尝试将套接字连接到一系列端点中的一个。它通过对套接字的connect成员函数进行重复调用,对序列中的每个端点调用一次,直到成功建立连接为止。

两者都没有更好的行为,尽管这在很大程度上是一个主观的术语。如何处理连接建立取决于您和您的应用程序。如果您需要向用户提供某种反馈,例如:"尝试连接到10个主机中的1个",使用socket.connect()在循环中而不是connect()自由函数可能更可取。

connect()自由函数接受一个端点迭代器,因此可以连接到所有已解析的可能端点。您链接到的TCP回显客户端就是这样做的。

tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), argv[1], argv[2]);
tcp::resolver::iterator iterator = resolver.resolve(query);

tcp::socket s(io_service);
boost::asio::connect(s, iterator);

6

为什么终端点是迭代器?

具有1个IP和1个端口的查询(tcp::resolver::query)只有一个终端点,但查询的参数可能包含URL:

boost::asio::ip::tcp::resolver::query query("www.baidu.com", "http");  

查询可以获取多个百度网站IP地址,如下代码所示:

boost::asio::ip::tcp::resolver::query query1("www.baidu.com", "http");
boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query1);
boost::asio::ip::tcp::resolver::iterator end; 
while (iter != end)
{
    boost::asio::ip::tcp::endpoint endpoint = *iter++;
    std::cout << endpoint << std::endl;
}

输出:

180.97.33.108:80
180.97.33.107:80

----------

daytime.1的例子中:

该例子涉及IT技术。
tcp::resolver::query query(argv[1], "daytime");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

现在我们创建并连接套接字。上面获取的端点列表可能包含IPv4和IPv6端点,因此我们需要尝试每个端点,直到找到一个可用的为止。这使得客户端程序独立于特定的IP版本。
查询可能包含多个端点,boost::asio::connect()可以自动连接其中一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接