io_context
Like traditional Unix network programming, Boost.Asioalso has “socket” concept, but that’s not enough, an io_context object (io_service class is deprecated now) is needed to communicate with Operating System’s I/O services. The architecture is like following:
io_context derives from execution_context:
class io_context: public execution_context{......}
While execution_context derives from noncopyable:
class execution_context: private noncopyable{......}
Check noncopyable class definition:
class noncopyable{protected:noncopyable() {}~noncopyable() {}private:noncopyable(const noncopyable&);const noncopyable& operator=(const noncopyable&);};
It means the io_context object can’t be copy constructed/copy assignment/move constructed/move assignment, So during initialization of socket, i.e., associate socket with io_context, the io_context should be passed as a reference. E.g.:
template <typename ProtocolBOOST_ASIO_SVC_TPARAM_DEF1(= datagram_socket_service<Protocol>)>class basic_datagram_socket: public basic_socket<Protocol BOOST_ASIO_SVC_TARG>{public:......explicit basic_datagram_socket(boost::asio::io_context& io_context): basic_socket<Protocol BOOST_ASIO_SVC_TARG>(io_context){}......}
