Boost.Asio рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЕрджрд░рдХ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ , рд╣рдордиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╕реНрдерд▓реЛрдВ рдХреЗ рд╕рд╛рде рдкреЗрдВрдЯреЗрд╕реНрдЯ рд╕рдВрдЧрдардиреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП "рдЕрджрд░рдХ" рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдЖрдЬ рд╣рдо рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрджрд░рдХ (рддрд░реНрдХ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ) рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╡рд┐рд╖рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕рдХреНрд╖рдо рд░реВрдк рд╕реЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдлрд┐рд░ рднреА, Boost.Asio рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╡рд░реЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдерд╛: "рдХреНрдпрд╛! рдпрд╣ рдмрд┐рд▓рдХреБрд▓ рдЕрд╕рдВрднрд╡ рд╣реИ! рдореИрдВ рдиреЛрдб рдХреА рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? "

рддрдм рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рджреВрд░рд╕реНрде рдореЗрдЬрдмрд╛рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣рдорд╛рд░реЗ рдкрд┐рдВрдЬрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд░реЗрдВред Boost.Asio рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрджрд┐рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдкрд░, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рдЗрдореЗрдЯ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдЬреЛ рд╣рдорд╛рд░реА рдЖрдЬреНрдЮрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред

рдпрд╣ рдПрдХ рд╕рд░рд▓ рд╕реЙрдХреЗрдЯ рдЖрд░реЗрдЦ рд╣реИ рдЬреЛ Boost.Asio рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред



рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдореЗрдВ, рдЗрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

template <typename Protocol, typename StreamSocketService = stream_socket_service<Protocol> > class basic_stream_socket : public basic_socket<Protocol, StreamSocketService> { } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдХреЙрд▓ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: asio :: basic_stream_socket рдХреЛ StreamSocketService рд╡рд░реНрдЧ рдореЗрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ Boost.Asio рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  template <typename ConnectHandler> void async_connect(const endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(ConnectHandler) handler) { ..... this->get_service().async_connect(this->get_implementation(), peer_endpoint, BOOST_ASIO_MOVE_CAST(ConnectHandler)(handler)); } 

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ; рд╕реНрдерд┐рд░ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕рд▓рд┐рдП, рд╕реЙрдХреЗрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реЙрдХреЗрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред



рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛ рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред



рдХреЛрдб рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рдзрд╛рдирддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред

рдорд╛рдирдХ рдЖрджрд┐рдо
 class BoostPrimitives { public: typedef boost::asio::ip::tcp::socket TCPSocket; typedef boost::asio::ip::icmp::socket ICMPSocket; typedef boost::asio::ip::tcp::resolver Resolver; typedef boost::asio::deadline_timer Timer; }; 

рдкрд░реАрдХреНрд╖рдг рдЖрджрд┐рдо
 class Primitives { public: typedef ba::basic_stream_socket < ba::ip::tcp, SocketService<ba::ip::tcp> > TCPSocket; typedef ba::basic_raw_socket < ba::ip::icmp, SocketService<ba::ip::icmp> > ICMPSocket; typedef ba::basic_deadline_timer < boost::posix_time::ptime, ba::time_traits<boost::posix_time::ptime>, TimerService < boost::posix_time::ptime, ba::time_traits<boost::posix_time::ptime> > > Timer; typedef ba::ip::basic_resolver < ba::ip::tcp, ResolverService<ba::ip::tcp> > Resolver; }; 

рд╕реЙрдХреЗрдЯреНрд╕ рд╕рд░реНрд╡рд┐рд╕, рдЯрд┐рдорд░рд╕реЗрд╡реНрд╕ рдФрд░ рд░реЗрдЬреЛрд▓реНрд╡рд░ рд╕рд░реНрд╡рд┐рд╕ - рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рдЯрд╛рдЗрдорд░ рдФрд░ рдирд╛рдо рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЦреБрдж рдХреЛ рд╕реЙрдХреЗрдЯ рдФрд░ рдЙрдирдХреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ, рдЕрджрд░рдХ рдХреЗ рдХрд╛рдордХрд╛рдЬреА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред



рдХреЛрдб рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИред

рдЕрджрд░рдХ рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди
 template<typename Traits> class PingerImpl { ..... //! Socket type typedef typename Traits::TCPSocket TCPSocket; ..... } 


рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрджрд░рдХ
 class Pinger { //! Implementation type typedef PingerImpl<BoostPrimitives> Impl; .... private: //! Implementation std::auto_ptr<Impl> m_Impl; }; 


рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрджрд░рдХ
 class BaseTest : boost::noncopyable { protected: //! Pinger implementation type typedef Net::PingerImpl<Test::Primitives> TestPinger; .... }; 


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЖрджрд┐рдо рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╣рдо Boost.Asio рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдиреЛрдб рдкрд┐рдВрдЧ) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди рднрд░рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЦрд╛рд▓реА рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдПрдХ рд░рд╛рдЬреНрдп рдЖрд░реЗрдЦ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред



рд╣рдо ICommand рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ Boost.Asio рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдБ (рдХрдиреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдиреЛрдб рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдЖрджрд┐)ред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдпреВрдПрдордПрд▓ рдЖрд░реЗрдЦ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдЯреАрдо рдЕрдореВрд░реНрддрддрд╛
 //! Pinger test command interface class ICommand : boost::noncopyable { public: //! Command pointer typedef boost::shared_ptr<ICommand> Ptr; //! Error callback type typedef boost::function<void(const boost::system::error_code&)> ErrorCallback; //! Error and size callback typedef boost::function<void(const boost::system::error_code&, std::size_t)> ErrorAndSizeCallback; //! Resolver callback typedef boost::function<void(const boost::system::error_code&, boost::asio::ip::tcp::resolver::iterator)> ResolverCallback; public: ICommand(const Status::Enum status) : m_Status(status) {} //! Timer wait virtual void AsyncWait(ErrorCallback& callback, boost::asio::io_service& io); //! Async connect virtual void AsyncConnect(ErrorCallback& callback, boost::asio::io_service& io); //! Async receive virtual void AsyncReceive(ErrorAndSizeCallback& callback, const std::vector<char>& sended, const boost::asio::mutable_buffer& buffer, boost::asio::io_service& io); //! Async resolve virtual void AsyncResolve(ResolverCallback& callback, boost::asio::io_service& io); //! Dtor virtual ~ICommand() {} protected: Status::Enum m_Status; }; 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрдерди рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: рдЗрд╕ рддрд░рд╣ рд╣рдо рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдиреЗрдХреНрд╢рди рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг
 void Connect::AsyncConnect(ErrorCallback& callback, boost::asio::io_service& io) { if (m_Status != Status::Pending) { io.post(boost::bind(callback, m_Code)); callback = ErrorCallback(); } } 


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдмрджрд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдереА:

 void ICommand::AsyncConnect(ErrorCallback& /*callback*/, boost::asio::io_service& /*io*/) { assert(false); } 

рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдЬреЛ рдХрдорд╛рдВрдб рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрддрд╛рд░ рдореЗрдВ рдХреЛрдИ рдХрдорд╛рдВрдб рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред

рдЖрджреЗрд╢ рдкрдВрдХреНрддрд┐ рдореЗрдВ "рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕" рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 //! Test fixture class Fixture { //! Commands list typedef std::list<ICommand::Ptr> Commands; public: Fixture(); ~Fixture(); static void Push(ICommand* cmd); static ICommand::Ptr Pop(); private: static Commands s_Commands; }; Fixture::Commands Fixture::s_Commands; Fixture::Fixture() { assert(s_Commands.empty()); // ,       - } Fixture::~Fixture() { assert(s_Commands.empty()); //      } void Fixture::Push(ICommand* cmd) { s_Commands.push_back(ICommand::Ptr(cmd)); } ICommand::Ptr Fixture::Pop() { assert(!s_Commands.empty()); const ICommand::Ptr result = s_Commands.front(); s_Commands.pop_front(); return result; } 


рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛
 template<typename T> void async_connect(implementation_type& /*impl*/, const endpoint& /*ep*/, const T& callback) { m_ConnectCallback = callback; Fixture::Pop()->AsyncConnect(m_ConnectCallback, m_Service); //   } 


рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг Google рдврд╛рдВрдЪреЗ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдпрд╣рд╛рдБ ICMP рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 class BaseTest : boost::noncopyable { protected: //! Pinger implementation type typedef Net::PingerImpl<Test::Primitives> TestPinger; BaseTest() { m_Pinger.reset(new TestPinger(boost::bind(&BaseTest::Callback, this, _1, _2))); } virtual ~BaseTest() { m_Pinger->AddRequest(m_Command); while (m_Pinger->IsActive()) boost::this_thread::interruptible_wait(100); } template<typename T> void Cmd(const Status::Enum status) { m_Fixture.Push(new T(status)); } template<typename T, typename A> void Cmd(const Status::Enum status, const A& arg) { m_Fixture.Push(new T(status, arg)); } void Callback(const Net::PingCommand& /*cmd*/, const Net::PingResult& /*rslt*/) { //     ,     } Fixture m_Fixture; std::auto_ptr<TestPinger> m_Pinger; Net::PingCommand m_Command; }; //        //   -   ,    . class ICMPTest : public testing::Test, public BaseTest { }; TEST(ICMPTest, ICMPSuccess) { m_Command.m_HostName = "ptsecurity.ru"; Cmd<Resolve>(Status::Success, m_Command.m_HostName); //  IP   Cmd<Wait>(Status::Pending); //   ,  Status::Pending тАУ ,      Cmd<Receive>(Status::Success); //        m_Command.m_Flags = SCANMGR_PING_ICMP; //        BaseTest } TEST(ICMPTest, ICMPFail) { m_Command.m_HostName = "ptsecurity.ru"; Cmd<Resolve>(Status::Success, m_Command.m_HostName); //  IP   Cmd<Wait>(Status::Success); //   ,  Status::Success тАУ ,     Cmd<Receive>(Status::Pending); //      m_Command.m_Flags = SCANMGR_PING_ICMP; //        BaseTest } 

рддреЛ, рдЕрджрд░рдХ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЖрдкрдХреЛ рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрджрд░рдХ рддрд░реНрдХ рдореЗрдВ рдХрдИ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдХрд┐ PingerImpl рд╡рд░реНрдЧ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рд╕реЗ рддрд░реНрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред



рдЖрд░реЗрдЦ рдореЗрдВ, Google рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TestLogic рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд░реНрдХ рдкрд░реАрдХреНрд╖рдг рдЙрди рддрд░реАрдХреЛрдВ рдФрд░ рддрд░реНрдХреЛрдВ рдХрд╛ рдХреНрд░рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрд░реАрдХреНрд╖рдг рддрд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 class TestLogic : public Net::PingerLogic { public: TestLogic(const Net::PingCommand& cmd, const Net::Pinger::Callback& callback) : Net::PingerLogic(cmd, callback) { } MOCK_METHOD1(InitPorts, void (const std::string& ports)); MOCK_METHOD1(ResolveIP, bool (const std::string& name)); MOCK_METHOD1(StartResolveNameByIp, void (unsigned long ip)); MOCK_METHOD1(StartResolveIpByName, void (const std::string& name)); MOCK_METHOD1(StartTCPPing, void (std::size_t timeout)); MOCK_METHOD1(StartICMPPing, void (std::size_t timeout)); MOCK_METHOD1(StartGetNetBiosName, void (const std::string& name)); MOCK_METHOD0(Cancel, void ()); }; 


рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА
 TEST(Logic, Start) { const std::string host = "ptsecurity.ru"; EXPECT_CALL(*m_Logic, InitPorts(g_TargetPorts)).Times(Exactly(1)); EXPECT_CALL(*m_Logic, ResolveIP(host)).Times(Exactly(1)).WillOnce(Return(true)); EXPECT_CALL(*m_Logic, StartResolveIpByName(host)).Times(Exactly(1)); m_Logic->OnStart(); } TEST(Logic, ResolveIp) { static const unsigned long ip = 0x10101010; EXPECT_CALL(*m_Logic, StartResolveNameByIp(ip)).Times(Exactly(1)); EXPECT_CALL(*m_Logic, StartICMPPing(1)).Times(Exactly(1)); EXPECT_CALL(*m_Logic, StartTCPPing(1)).Times(Exactly(1)); m_Logic->OnIpResolved(ip); } 


рдирддреАрдЬрддрди, рдХрд╛рд░реНрдп рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛, рдмреВрд╕реНрдЯ рдХрд╛ рд▓рд╛рднред рдПрд╕рд┐рдпреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрдИ рдЧрдВрднреАрд░ рдмрдЧреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЧрдИ рдереА :), рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдХрдИ рдШрдВрдЯреЛрдВ рдХреЗ рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЛрдб рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЕрджрд░рдХ рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ, рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдореВрд▓реА рдмрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рд╣реБрдЖ рдерд╛!

рдпрд╣рд╛рдБ рд╕реЗ рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

рд╕рд░реНрдЧреЗрдИ рдХрд░реНрдгрдЦреЛрд╡ ( CLRN ) рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

Source: https://habr.com/ru/post/In166139/


All Articles