Socket
There are 4 types of socket:
(1) basic_stream_socket:
This socket provides sequenced, reliable, two-way connection based byte streams. tcp::socket is an instance of this socket:
class tcp{....../// The TCP socket type.typedef basic_stream_socket<tcp> socket;......}
(2) basic_datagram_socket:
This socket provides connectionless, datagram service. udp::socket is an instance of this socket:
class udp{....../// The UDP socket type.typedef basic_datagram_socket<udp> socket;......}
(3) basic_raw_socket:
This socket provides access to internal network protocols and interfaces. icmp::socket is an instance of this socket:
class icmp{....../// The ICMP socket type.typedef basic_raw_socket<icmp> socket;......}
(4) basic_seq_packet_socket:
This socket combines stream and datagram: it provides a sequenced, reliable, two-way connection based datagrams service. SCTP is an example of this type of service.
All these 4 sockets derive from basic_socket class, and need to associate with an io_context during initialization. Take tcp::socket as an example:
boost::asio::io_context io_context;boost::asio::ip::tcp::socket socket{io_context};
Please notice the io_context should be a reference in constructor of socket (Please refer io_context). Still use basic_socket an an instance, one of its constructor is like following:
explicit basic_socket(boost::asio::io_context& io_context): basic_io_object<BOOST_ASIO_SVC_T>(io_context){}
For basic_io_object class, it does not support copy constructed/copy assignment:
......private:basic_io_object(const basic_io_object&);void operator=(const basic_io_object&);......
whilst it can be movable:
......protectd:basic_io_object(basic_io_object&& other){......}basic_io_object& operator=(basic_io_object&& other){......}
