C++ 如何传递参数以增强asio async_accept
我有一个问题 我正在使用boost::asio开发聊天服务器 在这里C++ 如何传递参数以增强asio async_accept,c++,boost,bind,boost-asio,stdbind,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())); accep
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);
}
void CServerSocket::StartAccept(boost::asio::ip::tcp::acceptor&acceptor)
{
std::shared_ptr套接字(新的boost::asio::ip::tcp::socket(acceptor.get_io_service());
acceptor.async_accept(*socket,std::bind(&CServerSocket::OnAccept,boost::asio::placeholders::error,socket,
标准:参考(受体));
}
void CServerSocket::OnAccept(const boost::system::error\u code&error,std::shared\u ptr socket,
boost::asio::ip::tcp::acceptor和acceptor)
{
如果(错误)
{
CLogManager::WriteLog((boost::format(“接受错误!:%1%”)error.message()).str().c_str());
返回;
}
m_SocketList.push_back(std::make_shared(这个,socket));
startacept(接受者);
}
在std::bind上,发生了一个错误
“错误c2064项不计算为包含3个参数的函数”
我该怎么办
谢谢。如果您使用的是
std::bind
,请将boost::asio::placeholders::error
替换为std::placeholders:::\u 1
接受处理程序只能将错误代码作为参数,请参阅:
我建议将acceptor
设置为CServerSocket
的成员,然后将调用更改为async\u accept
致:
并在
OnAccept
成员函数中访问acceptor
。一个错误是您忘记了要绑定的实例。您需要将此作为第二个参数<代码>std::bind(&CServerSocket::OnAccept,this,boost::asio::占位符::error,socket,std::ref(acceptor))我已经试过了。但是,发生了另一个错误。错误1错误C2664:“\u Rx std::\u Pmf\u wrap::operator()(const\u Wrapper&、\u V0\u t、\u V1\u t、\u V2\t)const”:无法将“boost::arg”强制转换为“const boost::system::Error\u code&”。c:\program files(x86)\microsoft visual studio 11.0\vc\include\functional 1152um这是第二个错误,我想。。。您不能将std::bind与std::shared_ptr一起使用,而是使用boost::asio::占位符。看,这是不对的。瞧,谢谢你发现了我的错误@Igor。我已经修改了我的答案,使用std::placeholder
而不是asio文档中的boost::placeholder
。您的答案仍然意味着不可能(或不正确)传递到CServerSocket::OnAccept
额外参数,这也是不正确的。
acceptor.async_accept(*socket, std::bind(&CServerSocket::OnAccept, this,
std::placeholders::_1));