Boost::Asio - Asynchroner Server Exception



  • Hiho,
    habe einen asynchronen Server gebastelt. Bei der Instanzierung per ctor crasht es dann. Den Fehler hatte ich noch nie und ich bin auch ziemlich verwundert, weil ich überhaupt nicht weiter weiß. Wie dem auch sei, hier erstmal der Code:

    #ifndef NETWORKASYNCSERVER_HEADER
    #define NETWORKASYNCSERVER_HEADER
    
    #include "Includes.h"
    
    namespace Network
    {
    	class AsyncTCPServer
    	{
    		private:
    			boost::scoped_ptr<boost::asio::ip::tcp::acceptor> m_pAcceptor;
    			boost::asio::ip::tcp::endpoint					  m_EndPoint;
    			boost::scoped_ptr<boost::thread>				  m_pThread;
    			boost::asio::io_service						      m_IOService;
    			boost::asio::ip::tcp::socket					  m_Socket;
    
    			void HandleAccept();
    
    		public:
    			AsyncTCPServer(const unsigned short Port);
    	};
    } // namespace Network
    
    //#endif NETWORKASYNCSERVER_HEADER
    
    #include "NetworkAsyncServer.h"
    
    namespace Network
    {
    	AsyncTCPServer::AsyncTCPServer(const unsigned short Port) :
    		m_EndPoint(boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), Port)),
    		m_pAcceptor(new boost::asio::ip::tcp::acceptor(m_IOService, m_EndPoint)),
    		m_Socket(m_IOService)
    	{
    		m_pAcceptor->async_accept(m_Socket, boost::bind(&Network::AsyncTCPServer::HandleAccept, this));
    
    		m_pThread.reset(new boost::thread
    		(
    			boost::bind(&boost::asio::io_service::run, &m_IOService))
    		);
    
    		m_IOService.run();
    		std::cout<<"Server: Started"<<std::endl;
    	}
    
    	void AsyncTCPServer::HandleAccept() 
    	{
    		std::cout<<"Server: Client connected"<<std::endl;
    	}
    } // namespace Network
    

    Zum Fehler: Ich glaube der Fehler liegt in der Initialisierungsliste. Für mich ist alles korrekt.

    Der Fehler: Unhandled exception at 0x77d13592 in Pong.exe: 0xC0000005: Access violation writing location 0xbaadf011.
    Außerdem wird mir in der win_mutex.hpp folgender Code angezeigt:

    #else
        __try
        {
          ::EnterCriticalSection(&crit_section_);
        }
        __except(GetExceptionCode() == STATUS_INVALID_HANDLE
            || GetExceptionCode() == STATUS_NO_MEMORY
            ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
        {
          if (GetExceptionCode() == STATUS_NO_MEMORY)
            return ERROR_OUTOFMEMORY;
          return ERROR_INVALID_HANDLE;
        }
    
        return 0;
    #endif
    

    Ich dachte immer das dieses Mutex-Gedöns etwas mit Thread's zu tun hätte, deswegen habe ich den Code mal ohne boost::thread probiert. Ohne Erfolg, der Fehler war derselbe.

    Ich hoffe ihr könnt mir irgendwie helfen? Was ist hier putt putt?

    Danke im Voraus ihr Süßen!



  • Warum benutzt Du nicht einfach den Debugger und guckst den CallStack an?

    Ich dachte immer das dieses Mutex-Gedöns etwas mit Thread's zu tun hätte, deswegen habe ich den Code mal ohne boost::thread probiert.

    Hat es auch. In Boost.Asio werden z.T. zusätzliche Threads erzeugt.



  • Erstmal danke schön 😘
    Hm, ja habe ich gemacht. Allerdings hat mich das nicht weitergebracht. Nun weiß ich aber woran es liegt:
    Zeile 32:

    m_pAcceptor(new boost::asio::ip::tcp::acceptor(m_IOService, m_EndPoint))
    

    Habe ich einen an der Schüppe? o0 Passt doch.



  • Ich hab gelesen, dass die Initialisierungsliste von Rechts abgearbeitet wird, hab aber die Quelle nicht parat.
    m_EndPoint ist noch nicht initialisiert, wenn du deinen acceptor erstellst.

    Funktioniert es so?

    namespace Network
    {
        AsyncTCPServer::AsyncTCPServer(const unsigned short Port) :
            m_pAcceptor(new boost::asio::ip::tcp::acceptor(m_IOService, m_EndPoint)),
            m_EndPoint(boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), Port)),
            m_Socket(m_IOService)
        {
    


  • Leider nein, selber Fehler 😞



  • l'abra d'or schrieb:

    [...]

    Das stimmt fast.
    Die Initialisierungsliste wird in der Reihenfolge abgearbeitet, in der die Variablen in der Klasse deklariert sind. Die Reihenfolge in der Initialisierungsliste spielt hingegen keine Rolle. So steht es im Standard.

    Den Grund des Fehlschlags hat l'abra d'or also schon passend genannt.

    Also so:

    private:
    			boost::asio::io_service						      m_IOService;
    			boost::asio::ip::tcp::endpoint					  m_EndPoint;
    			boost::asio::ip::tcp::socket					  m_Socket;
    			boost::scoped_ptr<boost::asio::ip::tcp::acceptor> m_pAcceptor;
    			boost::scoped_ptr<boost::thread>				  m_pThread;
    


  • Unglaublich, ich hatte die ganze Zeit das Gefühl das es daran liegt. Dachte mir nur jedesmal: "Mensch, ich bin doch nicht blöd, was mache ich hier" und habe wieder Steuerung + Z gedrückt.

    Aber interessant, wusste ich zugegebenermaßen noch gar nicht! Vielen lieben Dank meine Süßen!


Log in to reply