我正在使用boost :: asio进行网络通信,我想知道为什么在示例中有时使用socket.connect(endpoint)
和其他时间使用boost::asio::connect(socket, endpoint)
。根据代码boost::asio::connect
在端点迭代器的循环中调用socket.connect
。所以我的问题是:
哪种行为更好?使用boost :: asio :: connect或socket.connect? Personaly我更喜欢socket.connect,因为我只有一个端点。或者我可能是错的并误解了asio libs。
另外我的第二个问题是,为什么端点是一个迭代器?如果可以,当给出1个ip和1个端口时,多一个连接呢?
还有一个boost :: asio :: write和socket.write ...
示例如下:
答案 0 :(得分:14)
boost::asio::connect()
是一个更高级别的免费函数,可以调用boost::asio::ip::tcp::socket::connect()
。 documentation在这里相当清楚
此函数尝试将套接字连接到一个序列之一 端点。它通过重复调用套接字连接来完成此操作 成员函数,一次为序列中的每个端点,直到a 连接成功建立。
两者都没有更好的行为,尽管这主要是一个主观的术语。由您和您的应用程序决定如何处理连接建立。如果您需要向用户提供某种反馈,例如:"attempting to connect to host 1 of 10"
,最好在循环中使用socket.connect()
而不是connect()
免费功能。
connect()
free函数使用端点迭代器,因此它可以连接到所有可能已解析的端点。您链接到的tcp echo客户端执行此操作
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);
答案 1 :(得分:3)
为什么端点是迭代器?
具有1个ip和1个端口的查询(tcp :: resolver :: query)只有一个端点,但查询的参数可能包含URL:
boost::asio::ip::tcp::resolver::query query("www.baidu.com", "http");
查询可以获得baidu.com的多个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的示例中:
tcp::resolver::query query(argv[1], "daytime");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
现在我们创建并连接套接字。上面获得的端点列表可能包含IPv4和IPv6端点,因此我们需要尝试每个端点,直到找到有效的端点。这使客户端程序独立于特定的IP版本。
Query可能包含多个端点,boost :: asio :: connect()可以自动连接一个端点。