如何使用 lambda 作为连接处理程序调用 boost async_connect 作为成员函数

How to call boost async_connect as member function using lamba as connect handler

我成功地实现了 async_connect,使用它作为一个自由函数和一个 lambda 作为 connect_handler,如下所示:

auto self(shared_from_this());
boost::asio::async_connect(m_socket, endpoint_iter, [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

但是,现在我不得不使用 no_delay 标志。关于这个条目 boost::asio with no_delay not possible? 我必须调用 async_connect 作为套接字的成员函数。尝试如下

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}

我的编译器 (VS2013) 给我一个错误 Error 1 error C2338: ConnectHandler type requirements not met

有没有人有想法,如何正确做?

自由函数 async_connect 的处理程序签名应该是:

void handler(const boost::system::error_code& error, Iterator iterator);

成员函数basic_stream_socket::async_connect的处理程序签名应该是:

void handler(const boost::system::error_code& error);

原因是您将多个端点提供给自由函数,然后返回一个迭代器来告诉您哪个已连接,而您只将一个端点提供给成员函数而不必告诉您哪个一个已连接,因为您只提供了一个。

因此,为了让您的代码正常工作,您很可能只需要从 lambda 回调的参数中删除迭代器:

m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec){...}