如何使用现有的fd创建一个asio套接字,并回调到自定义代码中,而不是在数据可用时从中读取



我有一个C++应用程序,我使用的是第三方api。作为该api的一部分,他们将处理套接字连接等,然而,他们有一种模式,我可以在fd上选择/轮询,然后调用从套接字读取的api,解码数据并调度到适当的处理程序;通过这种方式,我们可以控制运行调度代码的线程。现在,我也广泛使用asio来建立网络,我想用它来处理这个问题。事实上,我希望api的调度代码能够在asio线程中运行。因此,我想要一个asio套接字,它接受现有的fd,然后在fd上有数据时调用我想要的内容。这看起来很直接,但我在文档/示例中找不到。

当然,这取决于您所使用的asio框架。

在我的基于libevent的框架中,我实现了类似以下的操作

void BaseConnection::take_socket(evutil_socket_t fd, short event_mask, int options)
{
this->bev = bufferevent_socket_new( get_event_base(), fd, options);
if (!this->bev) {
throw SimpleException("Error constructing bufferevent on fd #%d", fd);
}
bufferevent_setcb(bev, trampoline_readable, trampoline_writable , trampoline_event , (void*) this);
bufferevent_enable(bev, event_mask);
}

take_socket被调用之后fd将被buffered event占用(这个->bev)当收入数据可用时,将调用trampoline_readable

如果你正在使用boost::asio,尽管我不熟悉它,但你可能对basic_stream_socket::assign感兴趣。

祝你好运:)

我找到了我需要的东西,asio::posix::stream_descriptor。我可以给它分配套接字句柄(fd),然后调用async_wait,当有数据要读取时,asio会通知我:

descriptor_.assign(connection_.get_socket_handle());
descriptor_.async_wait(asio::posix::stream_descriptor::wait_read, [this] (const std::error_code& error) { this->handle_data(error); });

相关内容

最新更新