提问人:eniac 提问时间:11/17/2023 最后编辑:eniac 更新时间:11/17/2023 访问量:17
检查数据是否可在 ASIO 中读取
Check if data is available to read in ASIO
问:
我正在使用 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 为红色,然后做出响应。
答:
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();
});
}
}
我还在努力。我仍然在为使用股线而苦苦挣扎。
评论