проблемы с использованием boost :: async_connect

#c #boost #boost-asio

#c #повышение #boost-asio

Вопрос:

У меня не было проблем с блокировкой сокетов asio, но мое изучение асинхронных сокетов было кошмаром. может быть, я просто исчерпан:

   using boost::asio::ip::tcp;

  boost::asio::io_service io_service;

  tcp::resolver resolver(io_service);
  tcp::resolver::query query(newip, newport);
  tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

  tcp::socket socket(io_service);
  boost::system::error_code ec;

  auto f = std::bind(amp;Irc::connect_handler, this, boost::asio::placeholders::error,
    boost::asio::placeholders::iterator);
  boost::asio::async_connect(socket, endpoint_iterator, f);
  

мой обработчик определен как функция-член в классе Irc:

   void connect_handler(
    const boost::system::error_codeamp; ec,
    boost::asio::ip::tcp::resolver::iterator i)
  {
    // ...
  }
  

Я на VS2013, и ошибки не очень

 1>------ Build started: Project: Project18, Configuration: Debug Win32 ------
1>  Irc.cpp
1>c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1149): error C2664: 'void std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>::operator ()(_Farg0 amp;,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>) const' : cannot convert argument 2 from 'boost::arg<1>' to 'const boost::system::error_code amp;'
1>          with
1>          [
1>              InternetProtocol=boost::asio::ip::tcp
1>  ,            _Farg0=Irc
1>          ]
1>          Reason: cannot convert from 'boost::arg<1>' to 'const boost::system::error_code'
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>          c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 amp;,Arg2 amp;>,std::_Arg_idx<0,1,2>)' being compiled
1>          with
1>          [
1>              InternetProtocol=boost::asio::ip::tcp
1>  ,            Arg1=const boost::system::error_code
1>  ,            Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1>          ]
1>          c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::_Do_call<Arg1,Arg2,0,1,2>(std::tuple<Arg1 amp;,Arg2 amp;>,std::_Arg_idx<0,1,2>)' being compiled
1>          with
1>          [
1>              InternetProtocol=boost::asio::ip::tcp
1>  ,            Arg1=const boost::system::error_code
1>  ,            Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1>          ]
1>          c:localboost_1_55_0boostasiodetailhandler_type_requirements.hpp(98) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::operator ()<Arg1amp;,Arg2amp;>(Arg1 amp;,Arg2 amp;)' being compiled
1>          with
1>          [
1>              InternetProtocol=boost::asio::ip::tcp
1>  ,            Arg1=const boost::system::error_code
1>  ,            Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1>          ]
1>          c:localboost_1_55_0boostasioimplconnect.hpp(257) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>::operator ()<Arg1amp;,Arg2amp;>(Arg1 amp;,Arg2 amp;)' being compiled
1>          with
1>          [
1>              InternetProtocol=boost::asio::ip::tcp
1>  ,            Arg1=const boost::system::error_code
1>  ,            Arg2=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1>          ]
1>          c:userscdocumentsvisual studio 2012projectsproject18project18irc.cpp(37) : see reference to function template instantiation 'boost::asio::async_result<Handler>::type boost::asio::async_connect<Protocol,StreamSocketService,boost::asio::ip::basic_resolver_iterator<InternetProtocol>,std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<InternetProtocol>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>amp;>(boost::asio::basic_socket<Protocol,StreamSocketService> amp;,Iterator,ComposedConnectHandler)' being compiled
1>          with
1>          [
1>              Handler=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;>
1>  ,            Protocol=boost::asio::ip::tcp
1>  ,            StreamSocketService=boost::asio::stream_socket_service<boost::asio::ip::tcp>
1>  ,            InternetProtocol=boost::asio::ip::tcp
1>  ,            Iterator=boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>
1>  ,            ComposedConnectHandler=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Irc::* )(const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>),void,Irc,const boost::system::error_code amp;,boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>>,Irc *const ,boost::arg<1> amp;,boost::arg<2> amp;> amp;
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  

Комментарии:

1. Закрыт, потому asker is just exhausted что?

2. просто используйте лямбда-выражение вместо этой привязки.

Ответ №1:

Если вы используете std::bind , вам также необходимо использовать std::placeholders . Заполнители asio работают только с boost::bind .

Так что это должно исправить:

 auto f = std::bind(amp;Irc::connect_handler, this, std::placeholders::_1, std::placeholders::_2);
  

Комментарии:

1. 7 утра отсутствие кодирования сна приводит к этой ерунде, твой друг

2. Честно говоря, я думаю, что использование boost::bind более чистое, так как это позволит вам писать более выразительно boost::asio::placeholders . Кроме того, boost::bind поддерживается boost::shared_ptr с помощью функций-членов, что часто требуется для типичных асинхронных серверных размещений. И тот факт, что это boost, вряд ли является проблемой 🙂

Ответ №2:

Вам необходимо использовать boost::bind с заполнителями asio