boost :: asio如何将成员函数传递给concector.async_accept()

boost::asio how to pass member function to acceptor.async_accept()

本文关键字:async concector accept asio 函数 成员 boost      更新时间:2023-10-16

我试图将成员函数作为accepthandler传递给boost :: asio的async_accept()方法。我得到一个汇编错误,说:

accepthandler类型要求未满足

来自链接线:

//如果您在以下行中遇到错误,则意味着您的处理程序不符合Accepthandler的已记录类型要求。

文档说处理程序必须看起来像这样:

void accept_handler(const boost::system::error_code& error) //documentation
{
  if (!error)
  {
    // Accept succeeded.
  }
}

我的成员功能看起来像这样:

void WifiConnector::onAccept(const boost::system::error_code &ec) //my code
{
    if (ec) {
        std::cout << ec.message();
        return;
    }
    socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler);
}

我没有发现任何区别。

,但我必须调用accceptor.async_accept()方法:

acceptor.async_accept(socket, &WifiConnector::onAccept); //my code

而不是

acceptor.async_accept(socket, accept_handler); //documentation

因为我假设这是一个成员函数。如果我尝试像文档所建议的那样通过它:

acceptor.async_accept(socket, onAccept); //my code

有一个错误说:没有超载函数的实例。

是错误的,因为我以错误的方式传递了成员函数,还是我在做什么?

编辑:我正在从容纳受体等的对象中调用async_accept()方法。

提升文档提到了它如何将非静态方法传递给受体

摘录从上述链接:

void my_class::accept_handler(
    const boost::system::error_code& ec)
{
  ...
}
...
acceptor.async_accept(...,
    boost::bind(&my_class::accept_handler,
      this, boost::asio::placeholders::error));

如果您的类,可以将this替换为实例。

错误是因为我以错误的方式传递了成员功能,还是我在做什么错?

调用普通函数和调用(非静态)成员函数是有区别的。后一个只能与适当的对象一起调用。因此,您必须使用众多方法之一来转发呼叫。最简单的方法是使用lambda:

WifiConnector wifi;
...
acceptor.async_accept(socket, [&wifi] (const auto& ec) { wifi.onAccept(ec); } );

请注意,您必须对WiFi对象的寿命进行一些认真的想法,因为其他线程现在可以通过引用访问它,并依赖于拥有的线程使对象保持生存。例如,传递shared_ptrweak_ptr对象而不是普通引用(可能悬挂)并不是ASIO回调内部的罕见练习。