我使用Boost asio制作服务器,我遇到了问题。 我的服务器应该能够从多个连接的客户端接收数据,并将命令发送到特定的客户端。
要做到这一点,我为每个连接的客户端实例化一个新的连接会话,我在其中调用async_read,并使用一个调用async_write的回调调用async_read等...
我面临的问题如下:
A有一个服务器的GUI,我可以在其中单击要发送的命令,然后将这些命令放入共享队列。当队列被共享时,每个连接会话都可以轮询以查看是否有要发送到其连接的客户端的命令。
问题在于,#34;回调自称"在会话中的方案,如何在不破坏性能的情况下检查队列中何时有命令(我的第一个解决方案是在async_write操作上设置截止时间计时器以便每隔X秒检查一次)?
有什么想法吗?
答案 0 :(得分:0)
关键是基于pro-actor的事件处理与轮询队列基本相反。
通常你会创建一个队列并安排一个写循环(使用async_回调样式),直到它耗尽为止。例如:http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/example/cpp03/chat/chat_client.cpp(查找chat_message_queue
和write_in_progress
)。
基本上,你注入一个事件(即“消息排队”)并让异步调用链排空队列。为每条消息排队操作的好处是异步调用链执行隐式排序/同步¹
¹隐式线 - Why do I need strand per connection when using boost::asio?