我正在构建一个使用boost::asio
的Socket类。首先,我创建了一个connect
方法,它接受了主机和端口并将其解析为IP地址。这很好用,所以我决定查看async_resolve
。但是,我的回调总是得到错误代码995
(使用与它同步工作时相同的目标主机/端口)。
码:
启动分辨率的功能:
// 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()
的{{1}}功能是:
error_code
我的The I/O operation has been aborted because of either a thread exit or an application request
看起来像这样:
main.cpp
提前致谢!
答案 0 :(得分:9)
您的resolver
对象超出范围,将其移至Socket
类的成员,并使resolveHost
成为方法而不是自由函数。
这是因为boost::asio::ip::tcp::resolver
来自basic_resolver
basic_io_object
~basic_io_object()
,a typedef of来自{{1}}。当解析程序超出范围时,{{1}}之前的{{1}} which inherits基础解析程序服务。
无论是否异步 操作立即完成或 不,不会调用处理程序 从这个功能。调用 处理程序的执行将在一个 相当于使用的方式 提高:: ASIO :: io_service对象::柱()。