<分区>
除了 BOOST 网站上的教程外,还有关于多线程客户端的好教程吗? 一个可以处理向服务器发送数据的多线程客户端,同时还打印服务器正在发送的数据。 例如:一个用于处理用户输入并将其发送到服务器的线程,以及一个处理套接字并从服务器接收信息并将其打印在 cout 上的线程。
<分区>
除了 BOOST 网站上的教程外,还有关于多线程客户端的好教程吗? 一个可以处理向服务器发送数据的多线程客户端,同时还打印服务器正在发送的数据。 例如:一个用于处理用户输入并将其发送到服务器的线程,以及一个处理套接字并从服务器接收信息并将其打印在 cout 上的线程。
最佳答案
您提供的链接是关于如何使用 boost::asio 库的优秀指南。 一旦您了解它的工作原理,您将能够在没有多线程的情况下做您想做的事。
asio(异步IO)的思想是一旦io_service对象完成一个操作就回调你。每当你调用 aync_xxx 时,你都会向它传递一个函数指针(或仿函数),一旦操作完成就会调用它。这样,您就不必在轮询 IO 上阻塞单独的线程。
例如,一旦完成,您想从服务器读取一条消息。调用 do_something(Message& msg)。这正是示例代码所做的。
因为 TCP 是一种基于流的协议(protocol),没有自然的消息边界,您必须在其上定义自己的消息格式。在示例中,它为此目的定义了一个 chat_message 类。
要读取消息,客户端遵循这些步骤,每个步骤都是在先前的 async_xxx 操作完成后作为回调的结果触发的。它还依赖于这样一个事实,即仅当读取了指定的确切字节数或发生错误时,async_read 才完成。
请注意,在示例中,它在调用 async_read 之前在步骤 4 中执行了“cout.write...”。 您需要做的就是用您的 do_something(msg) 替换“cout.wirte..”部分。
写入部分遵循类似的回调链,唯一的区别是当没有更多消息可写入时链会中断,因此我们需要检查条件并重新启动它。
关于c++ - 关于多线程客户端的 BOOST 教程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238650/