Endpoint (Ponto de Extremidade)

O Asio fornece outros tipos de objetos endpoint para representar pontos finais de conexões de rede de outros protocolos, além do TCP. Por exemplo, o objeto asio::ip::udp::endpoint é usado para representar um ponto final de uma conexão de rede UDP. Ele é composto por um endereço IP e uma porta, e funciona de maneira similar ao objeto asio::ip::tcp::endpoint, mas é usado para protocolos UDP em vez de TCP.

O objeto asio::ip::tcp::endpoint é usado para representar um ponto final de uma conexão de rede TCP. Ele é composto por um endereço IP e uma porta, que são usados para identificar o host remoto ou o servidor que o programa deseja se conectar ou se comunicar.

Para usar o objeto asio::ip::tcp::endpoint, é preciso incluir o cabeçalho <boost/asio/ip/tcp.hpp> no seu código e criar um objeto da classe passando um endereço IP e uma porta para o construtor. Em seguida, é possível usar o objeto asio::ip::tcp::endpoint para identificar o host remoto ou o servidor que o programa deseja se conectar ou se comunicar.

O objeto asio::ip::tcp::endpoint também fornece uma série de outras funcionalidades úteis. Por exemplo, é possível usar as funções address e port para obter o endereço IP e a porta do objeto, respectivamente. Além disso, é possível usar a função to_string para obter uma string que representa o objeto asio::ip::tcp::endpoint.

Além disso, o Asio fornece outros tipos de objetos endpoint para representar pontos finais de conexões de outros protocolos, como o objeto asio::ip::icmp::endpoint para o protocolo ICMP e o objeto asio::local::stream_protocol::endpoint para o protocolo Unix local. Cada um desses objetos endpoint é composto por um endereço e uma porta, e fornece uma série de funcionalidades úteis para trabalhar com os respectivos protocolos de rede.

	basic_endpoint(const boost::asio::ip::address& addr, unsigned short port_num)
	    : impl_(addr, port_num)
	{
		//TODO
	}

O cliente usa o endpoint para designar o endereço do servidor, e o aplicativo do servidor usa o endpoint para identificar qual endereço será usado para escutar e aceitar conexões. Um exemplo de TCP endpoint abaixo:

	boost::asio::ip::tcp::endpoint endpoint{
		boost::asio::ip::make_address("127.0.0.1"), 3303};

Normalmente, o servidor precisa escutar(listen) todos os endereços da máquina atual e pode recorrer a outro construtor de basic_endpoint:

	basic_endpoint(const InternetProtocol& internet_protocol,
	      unsigned short port_num)
	    : impl_(internet_protocol.family(), port_num)
	{
	}

Um exemplo de servidor UDP que escuta todos os endereços IPv4 & IPv6:

	//IPv6
	boost::asio::ip::udp::endpoint endpoint{
            boost::asio::ip::udp::v6(),
            3303};
	...
	//IPv4
	boost::asio::ip::udp::endpoint endpoint{
            boost::asio::ip::udp::v4(),
            3306};

Em resumo, o Asio fornece uma série de objetos endpoint para representar pontos finais de conexões de rede de diferentes protocolos. Cada um desses objetos endpoint é composto por um endereço e uma porta, e fornece uma série de funcionalidades úteis para trabalhar com os respectivos protocolos de rede.