Я реализовал async_connect
успешно использовать его как свободную функцию и лямбда-код как 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 с no_delay невозможен? Я должен вызвать 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);
Причина в том, что вы даете несколько конечных точек свободной функции, которая затем возвращает вам итератор, чтобы сообщить вам, какой из них был подключен, в то время как вы предоставляете только одну конечную точку функции-члену, которая не должна сообщать вам, какая из них была подключена с тех пор, как вы только при условии один.
Поэтому для того, чтобы ваш код работал, вам, скорее всего, нужно просто удалить итератор из параметров вашего лямбда-обратного вызова:
m_socket.async_connect(endpoint_iter->endpoint(), [this, self](boost::system::error_code ec){...}
Других решений пока нет …