Boost Asio: Exception bei connect



  • Hallo! 😉

    Folgender Code:

    void net::TcpClientMessageSocket::connect(char const* host, char const* port) {
    	boost::asio::ip::tcp::resolver resolver(ioPool->getIoService());
    	boost::asio::ip::tcp::resolver::iterator iter =
    		resolver.resolve(boost::asio::ip::tcp::resolver::query(host, port));
    
    	// Try each available endpoint.
    	boost::system::error_code ec;
    	for (; iter != boost::asio::ip::tcp::resolver::iterator(); ++iter) {
    		std::cout << "Current endpoint - Address:" << iter->endpoint().address().to_string() <<
    			" Port: " << iter->endpoint().port() << std::endl;
    		socket.connect(*iter, ec);
    		if (!ec) {
    			return;
    		}
    	}
    
    	// Could not connect to any endpoint.
    	throw boost::system::system_error(ec, "connect");
    }
    

    Beim Versuch, den Code gegen localhost:12345 auszuführen, fliegt folgende Exception:

    connect: Bei dem Versuch das Zeigerargument eines Aufrufs zu
    verwenden, wurde eine ungültige Zeigeradresse gefunden

    Ich habe bis in die Socket-Opts hineindebuggt:

    void sync_connect(socket_type s, const socket_addr_type* addr,
        std::size_t addrlen, boost::system::error_code& ec)
    {
    ...
    }
    

    Hier ist addr (was eine sockaddr* ist) 0xCCCCCCCCCCCCCCCC, also wohl uninitialisierter Speicher. Wie passiert das?

    Ich vermute einen dummen Fehler, den ich einfach übersehe.
    Jemand eine Idee?
    Danke & schöne Grüße,
    Ethon



  • Ist zwar keine echte Antwort, aber 0xCCCC… ist eine Debug-Hilfe vom Microsoft-Compiler.

    0xFDFDFDFD	No man's land (normally outside of a process)
    0xDDDDDDDD	Freed memory
    0xCDCDCDCD	Uninitialized (global)
    0xCCCCCCCC	Uninitialized locals (on the stack)
    

    Aus https://msdn.microsoft.com/en-us/library/aa260966(v=vs.60).aspx
    Das grenzt Deine Suche ein wenig ein, ja, es ist wie Du vermutest.



  • Davon ging ich auch aus. 😉

    Habe jetzt zufälligerweise die freie connect Funktion gefunden, Problem gelöst:

    void net::TcpClientMessageSocket::connect(char const* host, char const* port) {
    	boost::asio::ip::tcp::resolver resolver(ioPool->getIoService());
    	boost::asio::ip::tcp::resolver::query query(host, port);
    
    	// Try each available endpoint.
    	boost::asio::connect(socket, resolver.resolve(query));
    }
    

    Auflösung, was war meine Dummheit? 😃


Anmelden zum Antworten