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

问题描述 投票:0回答:1

我正在使用 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 首先等待主机连接和前端连接。 来自FRONTEND的请求通过socket到达后端并放入inQueue中,由BACKEND处理,然后发送到HOST MACHINE。

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

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

我不能有这样的东西,因为在其他线程中我可能会从前端收到一条消息,需要由后端发送到主机并且正在使用套接字:

线程等待数据

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

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

asynchronous events asio
1个回答
0
投票

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

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();
        });
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.