Я использую C ++ Boost Asio Library, где я слушаю новые соединения на сокете. При получении соединения я обрабатываю запрос и затем прослушиваю новое соединение в другом сокете в цикле.
while (true)
{
tcp::socket soc(this->blitzIOService);
this->blitzAcceptor.listen();
boost::system::error_code ec;
this->blitzAcceptor.accept(soc,ec);
if (ec)
{
// Some error occured
cerr << "Error Value: " << ec.value() << endl;
cerr << "Error Message: " << ec.message() << endl;
soc.close();
break;
}
else
{
this->HandleRequest(soc);
soc.shutdown(tcp::socket::shutdown_both);
soc.close();
}
}
Насколько я понимаю, он всегда должен блокироваться в this-> blitzAcceptor.accept (soc, ec); и каждый раз, когда устанавливается новое соединение, он должен обрабатывать его в this-> HandleRequest ( soc); и снова блокировать на this-> blitzAcceptor.accept (soc, ec);
Но то, что я вижу, это то, что в первый раз он будет блокироваться в this-> blitzAcceptor.accept (soc, ec) , и когда будет установлено новое соединение, он будет обрабатывать запрос, но вместо этого повторная блокировка в this-> blitzAcceptor.accept (soc, ec) приведет к this-> HandleRequest (soc); и блокированию в soc.receive ( ); внутри.
Это не всегда происходит, но происходит большую часть времени. В чем может быть причина такого поведения, и как я могу гарантировать, что оно всегда блокируется в this-> blitzAcceptor.accept (soc, ec), пока не будет сделан новый запрос?