Sockets (Soquetes)

A classe asio::basic_stream_socket do Asio é uma classe genérica que é usada como base para a criação de classes de socket específicas para diferentes protocolos de rede. Ela fornece uma interface comum para realizar operações de entrada e saída em sockets e é a classe base para a criação de classes de socket para protocolos como TCP, UDP, ICMP e SCTP.

A asio::basic_stream_socket fornece uma série de funções de leitura e escrita assíncronas que podem ser usadas para enviar e receber dados através de um socket de forma assíncrona. Ela também oferece funções para estabelecer conexões com outros hosts na rede e para fechar conexões existentes.

Para usar a asio::basic_stream_socket, é preciso criar uma classe derivada que especifique o tipo de socket que deseja criar, como um socket TCP, UDP, ICMP ou SCTP. Em seguida, é possível criar um objeto da classe derivada e passar um objeto de resolução de endereço e um objeto de io_context para o construtor. Em seguida, é possível chamar as funções de leitura e escrita fornecidas pela asio::basic_stream_socket para enviar e receber dados através do socket.

Existem 4 tipos de sockets:

(1) basic_stream_socket:
Este socket fornece fluxos de bytes baseados em conexão bidirecional, confiável e sequencial. tcp::socket é uma instância deste socket:

	class tcp
	{
	......
	  /// The TCP socket type.
	  typedef basic_stream_socket<tcp> socket;
	......
	}

(2) basic_datagram_socket:
Este socket fornece serviço de datagrama sem garantias de conexão e não confiável. udp::socket é uma instância deste socket:

	class udp
	{
	......
	  /// The UDP socket type.
  	  typedef basic_datagram_socket<udp> socket;
	......
	}

(3) basic_raw_socket:
Este socket fornece acesso a protocolos e interfaces de rede interno. O icmp::socket é uma instância deste socket:

	class icmp
	{
	......
	  /// The ICMP socket type.
  	  typedef basic_raw_socket<icmp> socket;
	......
	}

(4) basic_seq_packet_socket:
Este socket combina fluxo(stream) e datagrama: fornece um serviço de datagramas com conexão bidirecional, confiável e bidirecional. SCTP é um exemplo deste tipo de serviço.

Todos esses 4 sockets derivam da classe basic_socket e precisam ser associados a um io_context durante a inicialização. Veja tcp::socket como exemplo:

		boost::asio::io_context io_context;
		boost::asio::ip::tcp::socket socket{io_context};

Observe que o io_context deve ser uma referência no construtor do socket (consulte io_context). Ainda use basic_socket e uma instância, um de seus construtores é o seguinte:

	  explicit basic_socket(boost::asio::io_context& io_context)
	    : basic_io_object<BOOST_ASIO_SVC_T>(io_context)
	  {
	  }

Para a classe basic_io_object, ele não suporta copy constructed/copy assignment:

	......
	private:
	  basic_io_object(const basic_io_object&);
	  void operator=(const basic_io_object&);
	......

mas suporta move constructed/move assignment:

	......
	protected:  
	  basic_io_object(basic_io_object&& other)
	  {
	    ......
	  }
	  basic_io_object& operator=(basic_io_object&& other)
	  {
	    ......
	  }

Além das funções de leitura e escrita assíncronas, a asio::basic_stream_socket também oferece uma série de outras funcionalidades úteis. Por exemplo, ela permite que o programa configure opções de socket, como o timeout de leitura e escrita, o tamanho do buffer de leitura e escrita e o uso de Keepalives. Ela também permite que o programa obtenha informações sobre o socket, como o endereço local e remoto, o estado da conexão e o número de bytes enviados e recebidos.

Em resumo, a asio::basic_stream_socket é uma classe genérica do Asio que é usada como base para a criação de classes de socket específicas para diferentes protocolos de rede. Ela fornece uma interface comum para realizar operações de entrada e saída em sockets e oferece uma série de funcionalidades úteis, como configuração de opções de socket e obtenção de informações sobre o socket.