|
Boost Users : |
Subject: [Boost-users] [asio] Error in async_accept
From: Germán Diago (germandiago_at_[hidden])
Date: 2009-12-15 13:36:54
Hello. I have this code (the variables that end with _ are instance
variables). The code works well as is, in a
synchronous way.
void tcpServer::startAccept()
{
tcpConnection::pointer new_connection =
tcpConnection::create(acceptor_.io_service());
boost::system::error_code error;
acceptor_.accept(new_connection->socket());
onAccept(new_connection, boost::system::error_code());
}
void tcpServer::onAccept(tcpConnection::pointer new_connection,
const boost::system::error_code & error)
{
if (!error)
{
if (currentconnections_ < maxconnections_)
{
boost::lock_guard<boost::mutex> l(mutexcurrconnections_);
/*connectionsinfo_.push_back(ServerConnectionInfoPtr(new
ServerConnectionInfo(
new_connection->socket().remote_endpoint().address().to_string(),
new_connection->socket().remote_endpoint().port(),
new_connection)));
*/
currentconnections_++;
}
else throw std::runtime_error("The server is full. No more
connections accepted");
/*boost::asio::async_read(new_connection->socket(),
boost::asio::buffer(bufferread_),
boost::bind(&tcpServer::onRead, this, _1, _2));
*/
vector<char> vecrecv(12);
std::size_t readsize = boost::asio::read(new_connection->socket(),
boost::asio::buffer(vecrecv));
cout << "Server received " << readsize << " bytes: " << endl;
copy(vecrecv.begin(), vecrecv.end(), ostream_iterator<char>(cout));
cout << endl;
std::string helloclient = "hello client";
std::vector<char> sendvec(helloclient.begin(), helloclient.end());
//TODO:Cambiar por receiveAllData()
//std::size_t writesize =
new_connection->socket().send(boost::asio::buffer(sendvec,
sendvec.size()));
std::size_t writesize = boost::asio::write(new_connection->socket(),
boost::asio::buffer(sendvec));
std::cout << "Written " << writesize << " bytes" << std::endl;
}
startAccept();
}
But if I change the function startAccept so that instead of doing what
it used to do, it does an asynchronous_accept:
void tcpServer::startAccept()
{
tcpConnection::pointer new_connection =
tcpConnection::create(acceptor_.io_service());
boost::system::error_code error;
acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcpServer::onAccept, this, boost::ref(new_connection),
boost::asio::placeholders::error));
}
I get the following errors:
terminate called after throwing an instance of
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error>
>'
what(): Socket operation on non-socket
terminate called after throwing an instance of
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error>
>'
what(): Connection reset by peer
Anyone can help? I have no clue of what's happening. The socket is a
shared_ptr, so it should be there when I use onAccept. Don't know what
happens.
Thanks for your time.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net