检查数据是否可在 ASIO 中读取

Check if data is available to read in ASIO

提问人:eniac 提问时间:11/17/2023 最后编辑:eniac 更新时间:11/17/2023 访问量:17

问:

我正在使用 ASIO 将旧的 c++ 代码迁移到更现代的 c++,但我有一个不确定如何使用 ASIO 解决的问题。

一般的理念是:

                    Act as Client and 
                     Server (same socket)       
            +----------BACKEND--------------+                
            |        ---------------+       |
            |       |  +-- MSG-+    |       |  Read/Write same Socket
            |       |  |       |    |     SOCKET         
FRONTEND  --|-----> v  inQueue  | inQueue <-|-----  HOST
         <--|----- outQueue    -> outQueue--|---->  MACHINE
            |-------------------------------|

BACKEND 首先等待 HOST 连接和 Frontend 连接。 来自 FRONTEND 的请求通过套接字到达后端,并放入 inQueue 中,由 BACKEND 处理,然后发送到 HOST MACHINE。

主机可能会不时发送需要响应的消息。

我的问题是在后端和主机之间。我需要使用相同的套接字来接收消息。 我需要一个线程等待来自主机的消息吗?有没有办法像旧代码一样检查套接字上的读偶数(不是我做的)?

我不能有这样的东西,因为在其他线程中,我可能会收到来自 FRONTEND 的消息,该消息需要由 BACKEND 发送到 HOST MACHINE 并且正在使用套接字:

线程等待数据

...
asio::async_read(*sock_.get(),....
...

旧代码使用“select”来检测读取事件阻塞,直到发生读取事件。 发生此事件时,套接字的 MSG 为红色,然后做出响应。

异步 事件 ASIO

评论

0赞 eniac 11/19/2023
我一直在做一些研究,在这个环节中发现了“反应堆式操作”。这似乎满足了我对后端的需求。
0赞 sehe 11/23/2023
确实,这就是门票。请考虑发布您的解决方案:)

答:

0赞 eniac 11/27/2023 #1

使用 asio 提供的 reactor 样式示例,我将套接字置于非阻塞模式,等待读取事件。

sock->non_blocking(true); 
sock->async_wait(asio::ip::tcp::socket::wait_read,    
std::bind(&HostServerComm::read_handler, this, 
std::placeholders::_1));

还有我的read_handler

void HostServerComm::read_handler(const asio::error_code& ec)
{
    if (!ec)
    {
        LOG(INFO) << "read_handler msg received";
        strand_.post([&]()
        {
                host_conn->read_message();
        });
    }
}

我还在努力。我仍然在为使用股线而苦苦挣扎。