boost :: asio :: ip :: tcp :: resolver :: iterator检查值是否为null

时间:2017-03-21 21:35:32

标签: c++ boost-asio

我有一段代码在执行时会引发访问冲突。它是boost :: asio的

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

在调试器中看起来问题出在endpoint-&gt; host_name()内部,因为它试图获取values_ [0]而values_为null。

这是一种常见的连接拒绝方案。我以为处理程序得到了端点,以便它知道它试图连接到谁!在尝试调用方法之前,我是否可以对迭代器进行某种检查?

它似乎通过并仍然在

上抛出访问冲突
if( endpoint != boost::asio::ip::tcp::resolver::iterator() )
{
    std::string blah = endpoint->host_name();
}

1 个答案:

答案 0 :(得分: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()是对象中处理与服务器通信的方法。

在conc_connection()退出后,解析程序对象消失。你必须找到一种方法让它坚持下去。 Web上的各种演示将其作为客户端对象的属性。

请分享您对此问题的体验。