2017-03-21 2 views
1

실행하면 액세스 위반이 발생하는 코드 블록이 있습니다. boost :: asio에 대한 async_connect 핸들러입니다. 이 [0] 널 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- 안에.

이것은 일반적인 연결 거부 시나리오입니다. 핸들러가 엔드 포인트를 가지고 있다고 생각하여 연결하려는 사람을 알 수있었습니다! 메서드를 호출하기 전에 iterator에서 수행 할 수있는 검사 방법이 있습니까?

통과하고 여전히 아마 당신이 지금이 문제를 알아 냈어요

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()은 서버와의 통신을 처리하는 객체의 메소드입니다.

resolver 개체는 establish_connection()이 종료 된 후에 사라집니다. 당신은 그것을 붙들 수있는 방법을 찾아야합니다. 웹의 다양한 데모는 클라이언트 객체의 속성으로 사용합니다.

이 문제와 경험을 공유하십시오.

관련 문제