c++ - 关于多线程客户端的 BOOST 教程?

标签 c++ boost

<分区>

除了 BOOST 网站上的教程外,还有关于多线程客户端的好教程吗? 一个可以处理向服务器发送数据的多线程客户端,同时还打印服务器正在发送的数据。 例如:一个用于处理用户输入并将其发送到服务器的线程,以及一个处理套接字并从服务器接收信息并将其打印在 cout 上的线程。

最佳答案

您提供的链接是关于如何使用 boost::asio 库的优秀指南。 一旦您了解它的工作原理,您将能够在没有多线程的情况下做您想做的事。

asio(异步IO)的思想是一旦io_service对象完成一个操作就回调你。每当你调用 aync_xxx 时,你都会向它传递一个函数指针(或仿函数),一旦操作完成就会调用它。这样,您就不必在轮询 IO 上阻塞单独的线程。

例如,一旦完成,您想从服务器读取一条消息。调用 do_something(Message& msg)。这正是示例代码所做的。

因为 TCP 是一种基于流的协议(protocol),没有自然的消息边界,您必须在其上定义自己的消息格式。在示例中,它为此目的定义了一个 chat_message 类。

要读取消息,客户端遵循这些步骤,每个步骤都是在先前的 async_xxx 操作完成后作为回调的结果触发的。它还依赖于这样一个事实,即仅当读取了指定的确切字节数或发生错误时,async_read 才完成。

  1. 调用 async_connect,将 handle_connect 作为其回调传递。
  2. handle_connect 调用 async_read,将 handle_read_header 作为其回调传递
  3. handle_read_header 调用 async_read,将 handle_read_body 作为其回调传递。
  4. handle_read_body 最终会调用 async_read,传递 handle_read_header 作为其回调,以便该过程为下一条消息重复自身。

请注意,在示例中,它在调用 async_read 之前在步骤 4 中执行了“cout.write...”。 您需要做的就是用您的 do_something(msg) 替换“cout.wirte..”部分。

写入部分遵循类似的回调链,唯一的区别是当没有更多消息可写入时链会中断,因此我们需要检查条件并重新启动它。

关于c++ - 关于多线程客户端的 BOOST 教程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238650/

相关文章:

c++ - 从 printf 格式字符串中提取类型信息

c++ - 我无法从串口发送连续数据

C++ Eclipse Galileo 让它显示行号 - 怎么样?

boost - boost文件系统可以更改文件的只读属性吗?

c++ - 如何在 Windows 8 开发者预览版上构建 Boost C++?

c++ - 在线判断有错吗?

c++ - 我可以创建一个链接另一个库但不依赖于它的包含的 C++ 库吗?

c++ - 如何使用 boost 从 mmap 文件中读取异构二进制数据?

c++ - 为什么 std::sub_match<T> 公开继承自 std::pair<T, T>?

c++ - 合并几个 boost 序列化的 OpenCV Mats