繁体   English   中英

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

[英]difference between socket.connect and boost::asio::connect

我正在使用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 ......

例子是:

  1. boost :: asio :: connect(套接字,端点) blocking_tcp_echo_client.cpp
  2. socket.connect(端点)( 有点旧但仍在工作) Daytime.1

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

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

两者都没有更好的行为,尽管这主要是一个主观的术语。 由您和您的应用程序决定如何处理连接建立。 如果你需要向用户提供某种反馈,例如: "attempting to connect to host 1 of 10" ,最好在循环中使用socket.connect()而不是connect() free函数。

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个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

----------

白天的例子中1:

tcp::resolver::query query(argv[1], "daytime");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

现在我们创建并连接套接字。 上面获得的端点列表可能包含IPv4和IPv6端点,因此我们需要尝试每个端点,直到找到有效的端点。 这使客户端程序独立于特定的IP版本。

Query可能包含几个端点,boost :: asio :: connect()可以自动连接一个端点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM