我正在使用 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”来检测读事件阻塞,直到发生读事件。 当此事件发生时,来自套接字的消息为红色,然后响应。
使用 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();
});
}
}
我仍在为此努力。我仍在为使用股线而苦苦挣扎。