套接字之间的差异.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?我个人更喜欢插座。连接,因为我只有一个端点。也许我错了,误解了asio库。
我的第二个问题是,为什么端点是迭代器?当给出1个ip和1个端口时,如何可能有多个连接?还有boost::asio::write和socket.write…
示例如下:
- boost::asio::connect(socket, endpoint) blocking_tcp_echo_client.cpp.
- socket.connect(endpoint)(有点旧,但仍然工作)Daytime.1
boost::asio::connect()
是将调用boost::asio::ip::tcp::socket::connect()
的高级自由函数。这里的文档非常清楚
这个函数尝试将一个套接字连接到序列之一端点。它通过重复调用套接字的connect来实现这一点成员函数,对序列中的每个端点执行一次,直到a连接成功建立。
都没有更好的行为,尽管这在很大程度上是一个主观的术语。如何处理连接建立取决于您和您的应用程序。如果您需要向用户提供某种类型的反馈,例如:"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
----------
在daytime.1的例子中:
tcp::resolver::query query(argv[1], "daytime");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
现在我们创建并连接套接字。上面获得的端点列表可能包含IPv4和IPv6端点,因此我们需要尝试每一个端点,直到找到一个有效的端点。这使得客户端程序独立于特定的IP版本。
查询可以包含多个端点,boost::asio::connect()可以自动连接其中一个。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- 我无法与 boost::asio::connect 建立连接
- 设置boost socket.connect的超时时间
- 为什么 boost::signals2::signal:<T>:connect 需要复制构造函数?
- 套接字之间的差异.Connect和boost::asio:: Connect
- Boost::signals2::signal::connect 的原型是什么?