2011-12-27 3 views
0

Привет Я написал одно простое приложение, которое использует асинхронные функции сокетов. Перед закрытием сокета я столкнулся с некоторыми проблемами.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; 
} 
+1

Я бы предложил разместить код. – Ralf

ответ

1

Похоже, быть парами разных вещей не так с опубликованным кодом. Я хотел бы предложить, начиная с небольшими шагами, то есть вдоль линий

  • start и stop ASIO рабочего потока чистоплотных (см пояснения ниже)
  • добавить код для запуска таймера: ручка OnTimerExpired правильно, проверьте код ошибки
  • надстройку в коде для async_connect: когда вызывается обработчик соединения, cancel таймер и код ошибки проверки.
  • добавить в других асинхронных операциях и т.д.

Для одного, когда вы cancel таймера ВПодключения обработчикя OnTimerExpired обработчика будет вызваны с boost::asio::operation_aborted, а затем вы close сокетом, который, вероятно, не то, что Вы хотите сделать.

Далее вы сообщаете io_service, но все же звоните stop. Как правило, если вы выполняете работу io_service, вы хотите остановить поток выполнения, удалив работу (например, это может быть выполнено путем сохранения работы в интеллектуальном указателе и ее сброса) и позволить чисто текущим запущенным асинхронным операциям.

+0

Спасибо, Ральф ... У меня проблема, которая была в другом месте. Но информация, которую вы предоставили в приведенном выше сообщении, действительно полезна для меня ... еще раз спасибо ... – Harish

+0

@ user1115256 принять этот ответ, если это вам помогло –

Смежные вопросы