2017-03-21 2 views
1

Ich habe einen Code-Block, der beim Ausführen eine Zugriffsverletzung auslöst. Es ist der async_connect-Handler für boost :: asio.boost :: asio :: ip :: tcp :: resolver :: iterator Überprüfen Sie, ob die Werte null sind

//------------------------------------------------------------------------------ 
void MyClient::OnConnect(const boost::system::error_code & errorCode, boost::asio::ip::tcp::resolver::iterator endpoint) 
{ 
    if (errorCode || endpoint == boost::asio::ip::tcp::resolver::iterator()) 
    { 
     // Error - An error occured while attempting to connect 
     // Most likely these error codes correspond to https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx 
     std::ostringstream msg; 
     msg << "An error occured while attempting to connect to " << endpoint->host_name() 
      << ". Error code: " << errorCode 
      << ". Error Message: " << ErrorCodeToString(errorCode); 

     LogError(msg.str().c_str(), __FUNCSIG__, __FILE__, __LINE__); 
     return; 
    } 

    // We connected to an endpoint 
    m_connectionState |= CONNECTED; 

Im Debugger es wie das Problem aussieht, ist innen endpoint-> host_name(), weil es versucht, erhalten values_ [0] während values_ null sind.

Dies ist ein häufig verwendetes Connection Refused-Szenario. Ich dachte, dass der Handler den Endpunkt erhalten hat, so dass er wusste, mit wem er sich verbinden wollte! Gibt es eine Art der Überprüfung, die ich auf dem Iterator durchführen kann, bevor ich versuche, eine Methode aufzurufen?

Es scheint und noch Zugriffsverletzung werfen auf

if(endpoint != boost::asio::ip::tcp::resolver::iterator()) 
{ 
    std::string blah = endpoint->host_name(); 
} 

Antwort

0

Wahrscheinlich habe dies herausgefunden, indem Sie jetzt passieren, aber ich werde ein paar Zeilen, falls jemand anderes geschieht auf sie schreiben.

Dieses Problem ähnelt einem, das ich hatte.

Dies wird nicht arbeiten, und wird ähnliche Ergebnisse zu dem, was Sie beschreiben, geben.

void establish_connection() { 
     tcp::resolver resolver(get_asio_io_service()); // this is a problem  
     tcp::resolver::query q{server_name, "https"}; 
     resolver.async_resolve(q, 
          [&](asio::error_code ec, 
           tcp::resolver::iterator it) { 
           this->handle_resolve(ec, it); 
          }); 
    } 

wo establish_connection() ein Verfahren, in dem Objekt ist, das bei der Kommunikation mit dem Server handelt.

Das Resolver-Objekt verschwindet nach dem Beenden von "make_connection()". Sie müssen einen Weg finden, um es herumzuhalten. Die verschiedenen Demos im Web haben es als Attribut des Client-Objekts.

Bitte teilen Sie Ihre Erfahrung mit diesem Problem.

Verwandte Themen