2016-04-17 8 views
0

Ich bin derzeit versucht, eine Server-Anwendung erstellen Boost :: Asio, die zwei einfache Dinge tut:boost :: Asio - async_wait in async_accept Handler stürzt Anwendung

  1. eine eingehende Verbindung Accept Client
  2. Sobald die Client akzeptiert wurde, eine boost::asio::deadline_timer beginnen, die sich wiederholt

Der folgende Code meiner aktuellen Versuch zeigt:

#define BOOST_ASIO_ENABLE_HANDLER_TRACKING 

#include <WinSock2.h> 
#include <Mswsock.h> 
#include <boost/asio/io_service.hpp> 
#include <boost/asio/ip/tcp.hpp> 
#include <boost/bind.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

using namespace boost::asio; 
using namespace boost::asio::ip; 

void timerHandler(const boost::system::error_code& errorCode, deadline_timer* timer) { 
    timer->expires_at(timer->expires_at() + boost::posix_time::seconds(1)); 
    timer->async_wait(boost::bind(timerHandler, _1, timer)); 
} 

void acceptHandler(const boost::system::error_code &errorCode, io_service *ioService) { 
    deadline_timer timer(*ioService, boost::posix_time::seconds(1)); 
    timer.async_wait(boost::bind(timerHandler, _1, &timer)); 
} 

int main(int argc, char** argv) { 
    io_service ioService; 
    tcp::socket socket(ioService); 
    tcp::acceptor acceptor{ ioService, tcp::endpoint{ tcp::v4(), 12345 } }; 
    acceptor.listen(); 
    acceptor.async_accept(socket, boost::bind(acceptHandler, _1, &ioService)); 
    ioService.run(); 
    return EXIT_SUCCESS; 
} 

Problem:

Der Timer irgendwie wie im acceptHandler erwartet funktioniert nicht. Irgendwie wird es zweimal abgebrochen, löst zusätzlich einen Fehler aus und stürzt schließlich die gesamte Anwendung ab.

Handler-Tracking Output:

@asio|1460922050.075890|0*1|[email protected]_accept 
@asio|1460922051.153952|>1|ec=system:0 
@asio|1460922051.153952|1*2|[email protected]_wait 
@asio|1460922051.153952|1|[email protected] 
@asio|1460922051.153952|<1| 
@asio|1460922051.153952|>2|ec=system:995 
@asio|1460922051.153952|2|[email protected] 

Fragen:

  1. Was die acceptHandler bewirkt, dass die deadline_timer in Zeile 4 der Handler Tracking-Ausgabe stornieren?
  2. Wie lautet der Fehler 995 in Zeile 6 des Handler Tracking-Ausgangs? Fehlermeldung ist: Die I/O-Operation entweder wegen eines Fadenausgang abgebrochen oder einer Anwendungsanforderung

  3. Was die bewirkt, dass der timerhandler deadline_timer in Zeile 7 des Tracking-Handler Ausgangs abzubrechen?

Antwort

2

timer in den acceptHandler auf dem Stapel zugeordnet und ist durch die Zeit daher nicht gültig timerHandler genannt wird. Sie müssen den Timer dynamisch zuweisen.

Außerdem sollten Sie in beiden Handlern nach Fehlercodes suchen. Dies ist besonders wichtig, wenn Sie das Programm und cancel den Timer beenden möchten.

+1

Was für ein dummer Fehler. Vielen Dank. Ich habe die Fehlerüberprüfung für die Einfachheit des Snippets hier gelassen. Ich arbeite normalerweise mit Switch-Cases in allen Handlern. – chrisp