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

时间:2013-01-09 15:27:59

标签: c++ boost

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

1 个答案:

答案 0 :(得分:1)

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

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

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

由于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作为其回调传递,以便该过程为下一条消息重复自身。
  5. 请注意,在示例中,它在调用async_read之前在步骤4中执行了“cout.write ...”。 您需要做的就是用do_something(msg)替换“cout.wirte ..”部分。

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