关于多线程客户机的BOOST教程
BOOST tutorial on multithreaded client?
除了BOOST网站上的一个之外,还有关于多线程客户端的好的教程吗?一个多线程客户端,可以处理发送数据到服务器,同时还可以打印服务器正在发送的内容。例如:一个线程负责用户输入的内容并将其发送给服务器,一个线程负责处理套接字并从服务器接收信息并在cout上打印。
您提供的链接是一个关于如何使用boost::asio库的优秀指南。一旦你理解了多线程的工作原理,你就可以在没有多线程的情况下做你想做的事情。
asio(异步IO)的思想是在io_service对象完成操作后回调您。无论何时调用aync_xxx,都要向它传递一个函数指针(或函子),该指针将在操作完成后被调用。这样,你就不必在轮询IOs时设置一个单独的线程阻塞。 例如,在完成后,您希望从服务器读取消息。调用do_something (Message&味精)。这正是示例代码所做的。
因为TCP是一个基于流的协议,没有自然的消息边界,你必须在它上面定义你自己的消息格式。在本例中,它为此定义了一个chat_message类。
要读取消息,客户端需要遵循以下步骤,每个步骤都是在前一个async_xxx操作完成后作为回调的结果触发的。它还依赖于这样一个事实,即只有在读取了指定的精确字节数或发生错误时,async_read才完成。
- 调用async_connect,传递handle_connect作为回调。
- handle_connect调用async_read,传递handle_read_header作为回调
- handle_read_header调用async_read,传递handle_read_body作为回调。
- handle_read_body将最终调用async_read,传递handle_read_header作为回调,以便下一个消息的过程重复自己。
注意,在示例中,在调用async_read之前,它在步骤4中执行了"cout.write…"。你所需要做的就是将"cout. write ."部分替换为do_something(msg)。
写入部分遵循类似的回调链,唯一的区别是,当没有更多的消息要写时,链中断,因此我们需要检查条件并重新启动它
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- 编译 boost 文件系统的教程文件时遇到问题
- boost::log 教程中的代码如何工作
- 我的代码是否等同于Boost.Asio教程中给出的代码
- brew install-boost没有给出正确的目录结构,没有python教程
- 为什么 std::bind 和 boost::bind 不能在这个 Boost.Asio 教程中互换使用
- Boost asio TCP发送和接收教程
- 链接boost日志教程时出现链接器错误(未定义的引用)
- Boost Asio:关于教程的一些问题(同步日间服务器/客户端)
- 关于多线程客户机的BOOST教程