【问题标题】:How do pass arguments to boost asio async_accept如何传递参数来提升 asio async_accept
【发布时间】:2013-12-19 22:34:28
【问题描述】:

我有一个问题。

我正在开发聊天服务器,使用 boost::asio。

这里,

void CServerSocket::StartAccept(boost::asio::ip::tcp::acceptor &acceptor)
{
    std::shared_ptr<boost::asio::ip::tcp::socket> socket(new boost::asio::ip::tcp::socket(acceptor.get_io_service()));

    acceptor.async_accept(*socket, std::bind(&CServerSocket::OnAccept, boost::asio::placeholders::error, socket,
        std::ref(acceptor)));
}

void CServerSocket::OnAccept(const boost::system::error_code &error, std::shared_ptr<boost::asio::ip::tcp::socket> socket, 
    boost::asio::ip::tcp::acceptor &acceptor)
{
    if (error)
    {
        CLogManager::WriteLog((boost::format("Accept error! : %1%") % error.message()).str().c_str());
        return;
    }

    m_SocketList.push_back(std::make_shared<CConnectionSocket>(this, socket));

    StartAccept(acceptor);
}

在 std::bind 处发生错误。

“错误 c2064 术语不计算为采用 3 个参数的函数”

我该怎么办?

谢谢。

【问题讨论】:

  • 一个错误是您忘记了要绑定的实例。你需要一个 this 作为第二个参数。 std::bind(&amp;CServerSocket::OnAccept, this, boost::asio::placeholders::error, socket, std::ref(acceptor))
  • 我已经试过了。但是,发生了另一个错误。错误 1 ​​错误 C2664: '_Rx std::_Pmf_wrap<_pmf_t>>::operator ()<:cserversocket>(const _Wrapper &,_V0_t,_V1_t,_V2_t) const':不能将 'boost::arg' 转换为 'const boost::system::error_code &'。 c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152
  • 嗯,这是第二个错误,我认为...您不能将 std::bind 与 std::shared_ptr 一起使用,但 boost::asio::placeholders。见here

标签: c++ boost bind boost-asio stdbind


【解决方案1】:

如果您使用的是std::bind,请将boost::asio::placeholders::error 替换为std::placeholders::_1

【讨论】:

    【解决方案2】:

    接受处理程序只能将错误代码作为参数,请参阅:AcceptHandler

    我建议将acceptor 设为CServerSocket 的成员,然后将呼叫更改为async_accept 到:

    acceptor.async_accept(*socket, std::bind(&CServerSocket::OnAccept, this,
                                             std::placeholders::_1));
    

    并在OnAccept 成员函数中访问acceptor

    【讨论】:

    • 这是不正确的。见std::bind documentation
    • 感谢您发现我的错误@Igor。我已经修改了我的答案以使用 std::placeholder 而不是 asio 文档中的 boost::placeholder
    • 您的回答仍然暗示不可能(或不正确)传递给CServerSocket::OnAccept 额外参数 - 这也是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多