2011-01-08 6 views
4

Я в процессе создания класса Socket, который использует boost::asio. Для начала я сделал метод connect, который взял хост и порт и разрешил его на IP-адрес. Это сработало хорошо, поэтому я решил посмотреть на async_resolve. Однако мой обратный вызов всегда получает код ошибки 995 (с использованием того же хоста/порта назначения, что и при работе синхронно).boost :: asio :: async_resolve Задача

код:

Функция, которая начинается разрешение:

// resolve a host asynchronously 
    template<typename ResolveHandler> 
    void resolveHost(const String& _host, Port _port, ResolveHandler _handler) const 
    { 
    boost::asio::ip::tcp::endpoint ret; 
    boost::asio::ip::tcp::resolver::query query(_host, boost::lexical_cast<std::string>(_port)); 
    boost::asio::ip::tcp::resolver r(m_IOService); 
    r.async_resolve(query, _handler); 
    }; // eo resolveHost 

код, который вызывает эту функцию:

void Socket::connect(const String& _host, Port _port) 
    { 
    // Anon function for resolution of the host-name and asynchronous calling of the above 
    auto anonResolve = [this](const boost::system::error_code& _errorCode, 
      boost::asio::ip::tcp::resolver_iterator _epIt) 
    { 
    // raise event 
    onResolve.raise(SocketResolveEventArgs(*this, !_errorCode ? (*_epIt).host_name() : String(""), _errorCode)); 

    // perform connect, calling back to anonymous function 
    if(!_errorCode) 
    connect(*_epIt); 
    }; 

    // Resolve the host calling back to anonymous function 
    Root::instance().resolveHost(_host, _port, anonResolve); 

    }; // eo connect 

message() функция error_code является:

The I/O operation has been aborted because of either a thread exit or an application request 

И мой main.cpp выглядит следующим образом:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
morse::Root root; 
TextSocket s; 
s.connect("somehost.com", 1234); 
while(true) 
{ 
    root.performIO(); // calls io_service::run_one() 
} 
return 0; 
} 

Спасибо заранее!

ответ

9

Ваш объект resolver выходит из сферы действия, переводит его в класс Socket и делает resolveHost скорее методом, чем бесплатной функцией.

Это происходит потому, что boost::asio::ip::tcp::resolver является a typedef ofbasic_resolver, which inherits от basic_io_object. Когда преобразователь выходит из области видимости, ~basic_io_object()destroys базовая услуга распознавателя перед вашим handler can be posted.

Независимо от того, завершает асинхронный операцию немедленно или нет, то обработчик не будет вызываться внутри этой функции. Invocation обработчика будет выполняться в способом, эквивалентным использованию boost :: asio :: io_service :: post().

+0

Спасибо большое, это должно было быть совершенно очевидно :) –

+2

@ Му-Сок без проблем, рад помочь. Иногда вам нужен второй набор глаз. –