2017-03-21 10 views
1

実行時にアクセス違反をスローするコードブロックがあります。 boost :: asioのasync_connectハンドラです。それは[0]がNULL values_いる間values_取得しようとしたので、それは問題のように見えるデバッガでboost :: asio :: ip :: tcp :: resolver :: iterator値がnullであることを確認します。

//------------------------------------------------------------------------------ 
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; 

は、HOST_NAME()> endpoint-内部にあります。

これは一般的な接続拒否のシナリオです。ハンドラがエンドポイントを持っているので、誰が接続しようとしているのか分かりました。メソッドを呼び出す前にイテレータで行うことができるチェックの方法はありますか?

合格とまだ

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

答えて

0

にアクセス違反をスローするようだおそらくあなたが今することでこれを考え出したが、私は他の誰かがそれに起こる場合には数行を投稿します。

この問題は、私が持っていたものに似ています。

これはではなく、の仕事で、あなたの説明に似た結果が得られます。

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); 
          }); 
    } 

establish_connection()は、サーバーとの通信を処理するオブジェクト内のメソッドです。

リゾルバオブジェクトは、establish_connection()が終了すると消えます。あなたはそれを固執する方法を見つけなければなりません。 Web上のさまざまなデモでは、クライアントオブジェクトの属性としてそれがあります。

この問題をご報告いただきありがとうございます。

関連する問題