![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
boost asio保姆级教程
文章平均质量分 57
boost asio教程
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
Knowledgebase
这个作者很懒,什么都没留下…
展开
-
33、boost asio 教程--多线程程序中同步完成处理程序
前面的四个教程通过仅从一个线程调用 boost::asio::io_context::run() 函数来避免处理程序同步的问题。正如您已经知道的,asio 库提供了一个保证:完成处理程序只会从当前调用 boost::asio::io_context::run() 的线程中调用。因此,只从一个线程调用 boost::asio::io_context::run() 可以确保处理程序不会并发运行。如果遇到这些限制,另一种方法是使用一组线程调用 boost::asio::io_context::run()。原创 2024-07-18 14:01:35 · 878 阅读 · 0 评论 -
32、boost asio 教程--服务器-客户端示例
服务器-客户端项目提供一个示例。让我们用boost.asio创建一个简单的项目,它生成两个可执行文件,一个代表服务器,另一个代表客户端。原创 2024-07-17 15:11:24 · 136 阅读 · 0 评论 -
31、boost asio 教程---实现同步 TCP daytime 服务端
来创建要发送回客户端的字符串。这个函数将在我们所有的 daytime 服务器应用程序中重复使用。这是一个迭代服务器,这意味着它一次处理一个连接。创建一个代表客户端连接的套接字,然后等待连接。这个教程程序展示了如何使用 Asio 实现一个基于 TCP 的服务器应用程序。对象来监听新的连接。它被初始化为监听 TCP 端口 13,用于 IPv4。有一个客户端正在访问我们的服务。确定当前时间并将此信息传输给客户端。最后,处理任何可能抛出的异常。原创 2024-07-16 14:39:39 · 125 阅读 · 0 评论 -
30、boost asio 教程---实现同步 TCP daytime 客户端
boost::asio::connect() 函数自动为我们完成这一任务。boost::asio::buffer() 函数自动确定数组的大小以帮助防止缓冲区溢出。端点列表使用类型为 ip::tcp::resolver::results_type 的对象返回。当服务器关闭连接时,ip::tcp::socket::read_some() 函数将以 boost::asio::error::eof 错误退出,这是我们知道退出循环的方式。为此,我们使用一个 ip::tcp::resolver 对象。原创 2024-07-16 14:37:51 · 26 阅读 · 0 评论 -
boost.any 介绍
Boost.Any 是 Boost C++ 库的一部分,它提供了一个灵活的、类型安全的、用于存储任意类型值的容器。Boost.Any 允许你在一个容器中存储不同类型的对象,而无需提前知道这些对象的确切类型。这对于编写通用代码或处理不同类型数据的情况非常有用。原创 2024-01-01 11:12:59 · 515 阅读 · 0 评论 -
29、boost asio 教程---里程碑 2
在处理自己的代码时,有时您可以跳过一些检查,只因为它是您自己的代码,您知道它是如何工作的。例如,它可能是这样的:“第一个字节是消息类型,接下来的两个字节是消息长度,让我们称之为N,然后是消息本身的N个字节”。他们中的一些人可能使用您的客户端应用程序的旧版本,该版本使用您的协议的旧版本进行操作。还有大量的黑客,他们会连接到您的服务器,并尝试通过发送不同的数据并分析您的服务器对该数据的处理或响应来有意地入侵。这就是为什么处理I/O如此重要,也是为什么在这一部分的课程中我们只谈论了缓冲区和I/O函数的原因。原创 2023-09-21 12:24:35 · 177 阅读 · 0 评论 -
28、boost asio 教程---SSL和TLS
然而,SSL本身,即“安全套接字层”,实际上是一个特定的标准,有三个主要修订版,它们都在很久以前就已经被弃用了。因此,在这个教程集中,当我提到“SSL”时,我指的是当前正在使用的SSL家族标准,而不是某个特定的已弃用标准版本。现在,可以像我们在之前的教程中学到的那样,使用 async_read、async_read_until 和 async_write 自由函数来使用此流的实例。在Boost.Asio中,流是一个概念。OpenSSL是一个相当庞大的工具,它值得有自己的书,而不仅仅是一个教程课程。原创 2023-09-21 11:23:54 · 715 阅读 · 0 评论 -
27、boost asio 教程---正确的读写数据 第三部分
即使您预留了所需的内存并正确限制了最大动态缓冲区大小,这也是不够的。另一方面,动态缓冲区的 prepare 和 commit 是 O(1),但 consume 是通过基于范围的 erase 函数实现的,在 std::vector 和 std::string 的两种情况下都意味着 O(n)。在上面的示例中,我们没有检查 async_write 操作是否仍在进行中,而 output.prepare 函数调用可能导致底层缓冲区的重新分配以及当前在 async_write 内部某处正在使用的迭代器或指针的失效。原创 2023-09-21 11:14:11 · 276 阅读 · 0 评论 -
26、boost asio 教程---正确的读写数据 第二部分
记住 `tcp::socket::async_connect` 成员函数,它接受一个端点作为参数,以及自由函数 `boost::asio::async_connect`,它可以处理一系列端点。这在 Boost.Asio 中是一种常见的做法,其中自由函数是某些现有功能的更高级通用化,而这些功能可以通过成员函数提供。我们将要讨论的函数有:`boost::asio::async_read`、`boost::asio::async_read_until` 和 `boost::asio::async_write`。原创 2023-09-21 11:06:18 · 248 阅读 · 0 评论 -
25、boost asio 教程---正确的读写数据
例如,你可以为长度为 150 字节的缓冲区安排 async_send 操作,该操作可能成功完成,但 bytes_transferred 的值可能小于 150。这意味着前面的 64 字节已成功发送,如果你仍然想传递全部的 150 字节,那么你应该使用另一个缓冲区视图安排下一个 async_send,该视图应从原始缓冲区的第 64 字节开始,长度为 150 - 64 = 86 字节。你将一个可变的缓冲区视图传递给它,它会接收一定量的数据,不超过给定的缓冲区大小。现在是时候学习如何详细进行数据的读取和写入了。原创 2023-09-21 10:49:19 · 179 阅读 · 0 评论 -
24、boost asio 教程---这么多缓冲区!
使用 boost::asio::dynamic_buffer 函数可以从 std::vector 或 std::string 创建动态缓冲区。请参阅“动态缓冲区”和“动态缓冲区,第2部分”课程。使用 boost::asio::buffer 函数来创建缓冲区视图。- boost::asio::streambuf 是 STL 兼容的 streambuf,由 Boost.Asio 提供,符合 DynamicBuffer 的要求。我们使用const缓冲区视图来从中读取数据,使用mutable缓冲区视图来写入数据。原创 2023-09-21 10:44:13 · 271 阅读 · 0 评论 -
23、boost asio 教程---动态缓冲区 第二部分
在之前的课程中,我们从自己的数据片段构建了缓冲区序列,因此如何访问缓冲区序列的数据或计算其大小是显而易见的。然而,在某些情况下,底层内存缓冲区对你是隐藏的,但你仍然需要知道如何访问缓冲区序列中的数据。最后,在本课程中,你应该学会如何将数据从一个缓冲区序列复制到另一个。当然,你可以手动执行此操作,因为你已经知道如何迭代缓冲区视图以及如何访问特定缓冲区视图的内存。buffer_iterator 了解序列由哪些片段组成,因此在迭代时可以从一个片段跳到另一个片段,因此不必担心超出特定缓冲区视图的边界。原创 2023-09-21 10:42:37 · 74 阅读 · 0 评论 -
22、boost asio 教程---动态缓冲区
如果缓冲区不足以容纳你的数据,它将动态调整大小(增长)。另一方面,当你从动态缓冲区读取数据时,你需要负责丢弃(消耗)已读取但不再需要的字节,以确保缓冲区不会永久增长。要直接访问`streambuf`中的数据,你可以使用`boost::asio::streambuf::data`成员函数,它返回接收到的数据的`const buffer sequence`。我们在“异步TCP服务器”和“进一步学习”课程中简要介绍了Boost.Asio提供的此类缓冲区,即`boost::asio::streambuf`。原创 2023-09-21 09:50:55 · 244 阅读 · 0 评论 -
21、boost asio 教程---缓冲区序列 第二部分
在上一节中,我们从我们自己的数据片段构建了缓冲区序列,因此如何访问缓冲区序列的数据或计算其大小是显而易见的。然而,在某些情况下,您可能会处理给定的缓冲区序列,而底层的内存缓冲区对您是隐藏的。最后,在这节课中你应该学会如何将数据从一个缓冲序列复制到另一个缓冲序列中。当然,你可以手动执行这个操作,因为你已经知道如何遍历缓冲视图以及如何访问特定缓冲视图的内存。`buffer_iterator`了解序列由哪些部分组成,因此在迭代时它会从一个部分跳到另一个部分,因此不需要担心越界访问某个特定的缓冲视图。原创 2023-09-21 09:34:00 · 95 阅读 · 0 评论 -
20、boost asio 教程---缓冲区序列
当您达到缓冲区的末尾时,您会从头开始继续填充它。如果您需要将其作为单个缓冲区视图传递到某个函数中,那么您将不得不将这些部分复制到额外的缓冲区中,以便整个消息可以呈现为一个连续的内存块。这也是更喜欢使用`std::array`而不是`std::vector`的另一个原因,以防止不必要的内存分配。`boost::asio::buffer` 是一个免费函数,它从给定的参数构建一个缓冲区序列(Buffer sequence)。然而,通常在编译时已知此类序列的长度,更好的方法是使用 `std::array`。原创 2023-09-20 17:29:59 · 130 阅读 · 0 评论 -
19、boost asio 教程---里程碑 1
要启动连接,应使用socket::async_connect成员函数(用于单个端点)或boost::asio::async_connect自由函数(用于一系列端点)。- 通常将套接字对象封装在某种“会话”中,这是一个高级抽象,它包含套接字本身以及与连接关联的其他附加数据,例如传入和传出数据缓冲区。- 如果需要在单个线程内将Boost.Asio事件轮询与其他轮询(操作系统、另一个API等)相结合,则使用io_context::poll成员函数,而不是io_context::run。但现在,让我们回到TCP。原创 2023-09-19 09:21:28 · 252 阅读 · 0 评论 -
18、boost asio 教程---手动事件轮询
通常,客户端应用程序会维护对系统事件的轮询。当然,您可以在额外的线程中运行io_context::run,但一般来说,这不是一个好主意,因为您将需要在这些轮询之间进行通信,这可能导致需要一堆棘手、不方便甚至不安全的代码。在实际的客户端中,您可能希望根据应用程序的特性和要求在并行线程中执行某些任务,这是可以的。在这种情况下,您可以使用多个io_context实例,其中一个仍然应在主系统轮询循环中执行io_context::poll,并通过boost::asio::post函数与其他上下文交换消息。原创 2023-09-19 09:19:39 · 222 阅读 · 0 评论 -
17、boost asio 教程---客户端 第二部分
如果使用Connection: keep-alive,您可以使用boost::asio::async_read_until函数来正确处理数据。您已经了解了客户端和服务器之间的区别,如何将主机名解析为IP地址,以及如何连接到给定的端点。在本课程中,我们将把所有这些内容汇总起来,编写一个非常简单的客户端应用程序。相反,您应该使用Boost.Beast,它提供了HTTP的构建和解析功能。我们请求的是http://google.com/,服务器回复我们应该导航到http://www.google.com/。原创 2023-09-19 09:16:41 · 228 阅读 · 0 评论 -
16、boost asio 教程---域名解析
还有udp::resolver、udp::endpoint、icmp::resolver和icmp::endpoint类。主机名解析都是相同的,端点也是相同的(它们只是IP地址和端口的配对)。因此,为了保持代码的一致性,当处理相同的协议时应使用相同的作用域:使用tcp::resolver::resolve来获取tcp::endpoint,并将其传递给tcp::socket::connect。用于将主机名解析为IP地址的类是boost::asio::ip::tcp::resolver。原创 2023-09-19 09:11:20 · 221 阅读 · 0 评论 -
15、boost asio 教程---客户端(终于来了!)
针对这两种标准,都有特殊的类和函数:ip::address_v4、ip::make_address_v4、ip::address_v6和ip::make_address_v6。此外,还有一个通用的类和函数,支持这两种标准,并且我在上面的示例中使用了它们:ip::address和ip::make_address。这将成功,如果在127.0.0.1:80上有某个应用程序等待(或监听)传入的连接,并且没有阻碍(如防火墙或格式不正确的路由表)阻止我们的客户端连接到该应用程序。2. 服务器还可以充当客户端的角色。原创 2023-09-18 16:42:24 · 185 阅读 · 0 评论 -
14、boost asio 教程---计时器
它们之间的区别在于deadline_timer基于boost::posix_time,而其他计时器基于std::chrono计时器。因此,没有真正需要详细讨论它们,因为它们提供相同的接口和行为类型。在上面的示例中,我们异步等待一段给定的时间(一秒钟),然后在等待结束后执行完成处理程序。与其他I/O实体一样,计时器附加到io_context对象上,并且它的处理程序在io_context::run函数循环中执行。在处理I/O的几乎任何应用程序中都需要的工具是计时器。取消当前等待的计时器是线程安全的。原创 2023-09-18 16:35:26 · 220 阅读 · 0 评论 -
13、boost asio 教程---多线程执行,第二部分
不同的用例和自定义平衡器的设计模式超出了本课程的范围。2. 在io_context上工作的对象,如套接字、接受器等,一旦绑定到io_context对象,就无法在其生命周期内重新绑定到另一个io_context。3. 好吧,这实际上不是执行模型本身的缺点,而是选择的平衡算法的缺点,或者是由于特定用例的执行模型的不当使用导致的。1. 您不需要处理strand或任何其他同步工具:因为每个io_context都在单独的线程内运行,所以不需要进行数据同步,只要从相同的io_context处理程序中访问相同的数据。原创 2023-09-18 16:28:29 · 149 阅读 · 0 评论 -
12、boost asio 教程---多线程执行
在下面的示例中,我们需要摆脱的是通过引用接受error_code参数的已弃用io::io_context::run重载。在这种情况下,该重载会在创建线程的地方生成错误,因为io::io_context::run指针在这种情况下是模棱两可的。因此,您需要做的一切就是决定哪些完成处理程序操作共享数据并应附加到相同的io_context::strand,哪些完成处理程序是独立的并且可以并行执行。5. 使用boost::asio::bind_executor函数将您的完成处理程序包装到相应的strand对象中。原创 2023-09-18 16:24:11 · 280 阅读 · 0 评论 -
11、boost asio 教程---将您自己的函数对象(functors)投放到io_context中
请注意,这些代码示例是使用Boost.Asio库来进行异步编程的,其中io_context是事件循环的关键组件,用于管理异步任务的执行。通过使用boost::asio::post,您可以将自定义的函数对象安排到io_context中以在事件循环中执行。但有时,您只需要在io_context::run轮询循环中执行给定的函数对象。boost::asio::post将给定的函数对象投放到执行队列中,并与其他函数对象和完成处理程序一起以通用方式执行。该函数是线程安全的,因此可以随时从不同的线程中进行投放。原创 2023-09-18 16:17:40 · 237 阅读 · 0 评论 -
10、boost asio 教程---阻止 `io_context::run` 返回
到目前为止,我们已经审查过的服务器始终在执行 `async_accept`,因此它们始终至少有一个已计划的任务,所以我们实际上不需要以这种方式保持它们运行。但是客户端不执行 `async_accept`,这对于它在某个时候没有计划的任务是正常的。要防止 `io_context::run` 返回,您应该使用 `boost::asio::executor_work_guard`(以前的 `io_context::work`,目前已弃用)类实例。`io_context::run` 运行直到所有计划的任务都完成。原创 2023-09-13 18:34:32 · 6578 阅读 · 0 评论 -
9、boost asio 教程---让事情更简单
在您的大型生产质量应用程序中,您不应直接使用Boost.Asio函数,就像您不应使用`fopen`或互斥锁一样。而您应该在构建在Boost.Beast之上的库的基础上构建应用程序,而Boost.Beast则是构建在Boost.Asio之上的。您的代码可能会生成导致应用程序崩溃的不可恢复错误,以及其他一些在Python中您永远不必面对的事情,除非您愿意。但是,您也可以以一种方式分层编写代码,其中每个层级具有与其自己的抽象级别相关的一组非常狭窄的职责,而该代码的最顶层可以与Python或Erlang一样高级。原创 2023-09-13 18:29:16 · 6383 阅读 · 0 评论 -
8、boost asio 教程---TCP聊天服务器
async_read` 和 `async_write` 完成处理程序现在与它们的异步会话函数分离开来。`async_read` 函数从远程客户端读取数据到 `streambuf` 中。会话的 `async_read` 函数将消息队列中的前一条消息发送到远程客户端。下载它,编译它,看看它是如何工作的。会话的读取处理程序从客户端格式化一条消息,将其传递给消息处理程序,并立即开始接收下一条消息。`post` 函数将一条消息广播给所有已连接的客户端。启动第二个telnet客户端后,第一个客户端应该看到:```原创 2023-09-13 18:26:46 · 6865 阅读 · 0 评论 -
7、boost asio 教程---进一步学习
这取决于服务器的逻辑。有时,只需在完成处理程序中捕获会话的共享指针,以便它至少能够在当前异步操作完成之前保持会话的活动状态。这可以通过在其他地方(例如刚才提到的服务器容器)保存会话的共享指针来实现,或者通过处理原始指针。但是,它的行为是特定于平台的 — 它可能会按您的期望工作,但也可能被操作系统忽略。在处理上一次操作接收到的一部分数据后,您应该将这部分数据从`streambuf`中丢弃,以防止它持续增长。好的,我们刚刚学习了我们需要了解的所有新内容,以便审查下一个示例 — 一个简单的TCP聊天服务器。原创 2023-09-13 18:11:37 · 6413 阅读 · 0 评论 -
6、boost asio 教程---错误处理
建议按值传递`std::string_view`,它由一个`std::size_t`和一个原始指针组成,这应该具有与`boost::system::error_code`相同的大小(或几乎相同的大小,取决于目标平台)。要从`boost::system::error_code`中获取人类可读的错误描述,您可以调用`message()`成员函数,它将返回包含错误描述的`std::string`。异步I/O函数不会抛出异常。要通过引用返回错误,会使用`boost::system::error_code`的实例。原创 2023-09-13 18:03:32 · 6322 阅读 · 0 评论 -
5、boost asio 教程---异步TCP服务器
这个“后台”在哪里呢?它是从`std::streambuf`继承的子类,因此在这个时候,您可以将它视为与asio相关的`streambuf`。- `boost::asio::ip::tcp::socket` — 这与之前一样是一个套接字,只是现在用于TCP协议(而不是我们之前的UDP服务器的UDP协议)。所以,服务器等待新的传入连接,当它接收到一个连接时,它创建一个会话对象,并将与接受的连接相关联的套接字移动到会话中。- `boost::asio::ip::tcp::acceptor` — 这是新的内容。原创 2023-09-13 17:57:16 · 6882 阅读 · 0 评论 -
4、boost asio 教程---告别同步
然而,这种方法会增加你的应用程序的复杂性,因为你需要同步并发线程的控制流。而且,没有安全的方法可以从不同的线程取消阻塞的I/O操作。这可能会按照你的期望工作,但一般情况下是不安全的,如果你的环境发生变化(例如,如果你为一个之前没有使用过的新平台编译你的代码),你可能会面临意外的行为。简而言之,异步任务执行可以翻译成英语如下:“在后台开始执行这个任务,当完成时,调用这个函数。然而,同步I/O是阻塞的,这意味着你的应用程序的控制流会被阻塞,直到当前的I/O操作完成。与此同时,是时候告别同步代码,继续前进了。原创 2023-09-08 10:43:11 · 6752 阅读 · 1 评论 -
3、boost asio 教程---最简单的服务器
boost::asio::io_context(前身为boost::asio::io_service)是一种主要I/O服务提供程序。在这里可以找到许多用于不同服务的常用端口列表:TCP和UDP端口号码然而,通常,只有在安装了操作系统的机器上才会同时使用其中的少数服务。您不会找到此课程可下载的.cpp文件,因为上面的代码是一个完整的UDP回声服务器!这是一个非常好的描述,事实上,服务器只不过是这样。服务器没有什么真正的神奇之处,它只是一个接收其他应用程序发送的数据并返回一些数据的应用程序。原创 2023-09-06 15:40:47 · 8328 阅读 · 1 评论 -
2、boost asio 教程---Tcp和Udp
与TCP相比,UDP没有这样的事情作为UDP连接。传输控制协议-TCP 简而言之,TCP连接几乎就像一个文件-你打开它,你从中读取一些数据,你写入其他一些数据,当你完成时关闭它。实际上并不能保证您将收到发送给您的应用程序的所有数据包。用于接收UDP数据包的缓冲区必须足够大,以包含整个数据包的一部分,否则您将什么也收不到。因此,您需要了解将要接收的数据包的上限大小。正如您所看到的,UDP比TCP更棘手一些。在TCP连接的情况下,您不能这样做。这是您目前需要了解的关于协议的所有内容。原创 2023-09-06 15:33:35 · 7281 阅读 · 1 评论 -
1、boost asio 教程---介绍
因此,您将看到boost::asio::ip::tcp::socket这样的东西,在您的生产代码中应该别名为tcp::socket这样的东西。为了顺利进行,您应该熟悉现代C++,STL和Boost风格的编码,以及基本的网络和多线程原理。事实上,对于大多数示例,您所需要的只是编译boost/libs/system/src/error_code.cpp-其余的Boost源代码都是仅头文件库,太棒了!答案是肯定的,也不一定。您需要将Boost库添加到include目录,并将您的应用程序链接到其编译的源代码。原创 2023-09-06 15:27:53 · 7339 阅读 · 1 评论