首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >socket.connect与boost::asio::connect的区别

socket.connect与boost::asio::connect的区别
EN

Stack Overflow用户
提问于 2013-03-28 16:21:07
回答 2查看 16.7K关注 0票数 14

我正在使用boost::asio进行网络通信,我想知道为什么在示例中有时使用socket.connect(endpoint),有时使用boost::asio::connect(socket, endpoint)。根据代码,boost::asio::connect在端点迭代器的循环中调用socket.connect。所以我的问题是:

哪种行为更好?使用boost::asio::connect还是socket.connect?就个人而言,我更喜欢socket.connect,因为我只有一个端点。或者我错了,误解了asio语言。

另外,我的第二个问题是,,为什么端点是迭代器?如果给定了一个ip和一个端口,怎么可能有更多的连接呢?

还有一个促进::asio::写和socket.write.

例子如下:

  1. boost::asio::client.cpp (套接字,端点)。
  2. Socket.connect(端点)(稍老但仍在工作) Daytime.1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 16:58:40

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

此函数尝试将套接字连接到一系列端点之一。它通过重复调用套接字的连接成员函数(对序列中的每个端点调用一次)来完成这一任务,直到成功建立连接为止。

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

connect()空闲函数使用一个端点迭代器,这样它就可以连接到所有可能解析的端点。链接到的tcp回送客户端执行此操作。

代码语言:javascript
复制
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);
票数 17
EN

Stack Overflow用户

发布于 2016-11-17 04:44:42

为什么端点是迭代器?

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

代码语言:javascript
复制
boost::asio::ip::tcp::resolver::query query("www.baidu.com", "http");  

查询可以获得baidu.com的多个ip地址,如代码所示:

代码语言:javascript
复制
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;
}

输出:

代码语言:javascript
复制
180.97.33.108:80
180.97.33.107:80

daytime.1的例子中

代码语言:javascript
复制
tcp::resolver::query query(argv[1], "daytime");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15687016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档