Привет Я написал одно простое приложение, которое использует асинхронные функции сокетов. Перед закрытием сокета я столкнулся с некоторыми проблемами.boost :: asio :: io_service :: run() не выходит, когда я вызываю boost :: asio :: io_serive :: stop()
Я использую 5-секундный таймер перед вызовом async_connect
на сокете. В некоторых случаях соединение не происходит, и таймер истекает. Когда таймер истек, я закрываю сокет tcp_socket.close()
. Но дело в том, что обработчик обратного вызова моего соединения вообще не вызван с ошибкой boost::asio::error::operation_aborted
, когда я попытался отменить, а не закрыть. То же самое происходит и для следующего запуска асинхронного соединения.
Eventough Я закрываю сокет tcp и уничтожаю объект client_session. Join() вызов созданного потока не выходит. Io_service :: run() все еще работает, но не выходит ... :-(знаю, почему это происходит ... пробовал много других способов еще сталкивается с той же проблемой.
я не получаю, что это проблема, все предложения и решения будут оценены.
Мой реальный код то, что некоторые выглядят например,
class client_session
{
public:
client_session(boost::asio::io_service& io_service_)tcp_socekt_(io_service_),
timer_(io_service_)
{
}
~client_session()
{
tcp_socket_.close();
}
void OnTimerExpired(const boost::system::error_code& err)
{
if(err) tcp_socket_.close();
}
//Its just for example this will be called from upper layer of my module. giving some information about the server.
void connect()
{
//Here am starting the timer
timer_.expires_from_now(boost::posix_time::seconds(2));
timer_.async_wait(boost::bind(&OutgoingSession::OnTimerExpiry, this,PLACEHLDRS::error));
.......
tcp_socket_.async_connect(iterator->endpoint(), boost::bind(&OutgoingSession::handle_connect, this, _1, iterator));
......
}
void OnConnect(const boost::system::error_code& err)
{
//Cancelling the timer
timer_.cancel();
.....
//Register for write to send the request to server
......
}
private:
tcp::socket tcp_socket_;
deadline_timer timer_;
}
void main()
{
boost::asio::io_service tcp_io_service;
boost::asio::io_service::work tcp_work(tcp_io_service);
boost::thread* worker = new boost::thread(&boost::asio::io_service::run,&tcp_io_service);
client_session* csession = new client_session(tcp_io_service);
csession->connect();
sleep(10);
tcp_io_service.stop();
delete csession;
worker.join(); //Here it not coming out of join because io_service::run() is not exited yet.
cout<<"Termination successfull"<<endl;
}
Я бы предложил разместить код. – Ralf