关于多线程客户机的BOOST教程

BOOST tutorial on multithreaded client?

本文关键字:BOOST 教程 客户机 多线程      更新时间:2023-10-16

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

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

asio(异步IO)的思想是在io_service对象完成操作后回调您。无论何时调用aync_xxx,都要向它传递一个函数指针(或函子),该指针将在操作完成后被调用。这样,你就不必在轮询IOs时设置一个单独的线程阻塞。 例如,在

完成后,您希望从服务器读取消息。调用do_something (Message&味精)。这正是示例代码所做的。

因为TCP是一个基于流的协议,没有自然的消息边界,你必须在它上面定义你自己的消息格式。在本例中,它为此定义了一个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…"。你所需要做的就是将"cout. write ."部分替换为do_something(msg)。

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