如何传递参数来提升asio async_accept

时间:2013-12-19 22:34:28

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

我有一个问题。

我正在使用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个参数的函数”

我该怎么办?

感谢。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

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

我建议acceptor成为CServerSocket的成员,然后将来电更改为async_accept  到:

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

并访问acceptor成员函数中的OnAccept