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
- eine eingehende Verbindung Accept Client
- 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:
- Was die
acceptHandler
bewirkt, dass die deadline_timer in Zeile 4 der Handler Tracking-Ausgabe stornieren? 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
Was die bewirkt, dass der timerhandler deadline_timer in Zeile 7 des Tracking-Handler Ausgangs abzubrechen?
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