Como usar controles avançados de soquete (HTML)
[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]
Este tópico mostra como usar controles de soquete avançados quando usamos os recursos DatagramSocket, StreamSocket, StreamSocketListener em um aplicativo da Windows Store.
O que você precisa saber
Tecnologias
-
Habilita comunicações de rede usando soquetes e WebSockets.
Pré-requisitos
- Os exemplos seguintes neste tópico são fornecidos em JavaScript. Recomendamos conhecimento básico em soquetes.
Visão geral dos controles avançados
As classes DatagramSocket, StreamSocket e StreamSocketListener seguem o mesmo modelo para uso de controles avançados. Cada uma das classes primárias acima corresponde a classes relacionadas de acesso a controles avançados:
- DatagramSocketControl - Fornece dados de controle de soquete em um objeto DatagramSocket.
- StreamSocketControl - Fornece dados de controle de soquete em um objeto StreamSocket.
- StreamSocketListenerControl - Fornece dados de controle de soquete em um objeto StreamSocketListener.
O modelo básico para usar controles avançados é o mesmo para as três classes. O assunto abordado a seguir usa StreamSocket como exemplo, mas o mesmo processo pode ser usado com um DatagramSocket ou StreamSocketListener.
- Crie um StreamSocket.
- Use a propriedade StreamSocket.Control para obter a instância StreamSocketControl associada a um objeto StreamSocket.
- Obtenha o defina uma propriedade em StreamSocketControl para configurar uma opção de soquete avançada.
O aplicativo deve sempre definir uma propriedade no StreamSocketControl antes de emitir uma operação de conexão ou que vincule o soquete. Por causa disso, é melhor definir todas as opções avançadas imediatamente após a criação do soquete. Não tente definir uma propriedade StreamSocketControl depois que um soquete chamar um dos métodos ConnectAsync.
Controles do soquete de datagrama
O DatagramSocket dá suporte à comunicação de rede usando um soquete de datagrama UDP. As opções avançadas no DatagramSocket são limitadas a uma opção:
- DatagramSocketControl.QualityOfService - A qualidade de serviço em um objeto DatagramSocket.
A qualidade de serviço afeta a prioridade de thread no recebimento de pacotes no objeto DatagramSocket. A qualidade de serviço pode ser definida como um de dois valores possíveis para a enumeração SocketQualityOfService. A configuração normal é a padrão quando um DatagramSocket é criado. A configuração lowLatency aumenta a prioridade de threads para recebimento de pacotes. Normalmente, essa opção é usada somente para aplicativos de áudio ou semelhantes, que são muito precisos em relação ao tempo.
O exemplo a seguir cria um DatagramSocket e define DatagramSocketControl.QualityOfService como lowLatency para um aplicativo que depende de precisão temporal. Depois disso, o aplicativo poderá chamar outros métodos no DatagramSocket que vinculam ou conectam o soquete.
var clientSocket = new Windows.Networking.Sockets.DatagramSocket();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.QualityOfService;
// Set quality of service to low latency
clientSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now use the DatagramSocket to call:
// BindEndpointAsync, BindServiceNameAsync,
// ConnectAsync, GetOutputstreamAsync, or
// JoinMulticastGroup
Controles do soquete StreamSocket
O StreamSocket dá suporte à comunicação de rede usando um soquete de fluxo TCP. Há diversas opções avançadas em StreamSocket:
- StreamSocketControl.KeepAlive - Indica se os pacotes keep alive são enviados ao destino remoto em um objeto StreamSocket.
- StreamSocketControl.NoDelay - Indica se o algoritmo de Nagle é usado em um objeto StreamSocket.
- StreamSocketControl.OutboundBufferSizeInBytes - Controla o tamanho, em bytes, do buffer de envio que será usado para enviar dados em um objeto StreamSocket.
- StreamSocketControl.QualityOfService - A qualidade de serviço em um objeto StreamSocket.
Neste exemplo, alteraremos a propriedade StreamSocketControl.NoDelay que controla se o algoritmo de Nagle é ativado ou desativado.
O algoritmo de Nagle é uma técnica para aprimorar a eficiência de redes TCP/IP reduzindo o número de pacotes que precisam ser enviados pela rede. O algoritmo tenta lidar com problemas causados por um aplicativo que emite dados repetidamente em pequenas partes. Um pacote TCP para IPv4 sem outras opções de cabeçalho tem um cabeçalho de 40 bytes (20 bytes para IP e 20 bytes para TCP). Por isso, se um aplicativo envia somente 4 bytes em um pacote, a sobrecarga nos dados do pacote é muito grande. Isso pode ocorrer com um protocolo de acesso remoto (telnet ou shell seguro, por exemplo) em que a maior parte das ações de pressionar uma tecla pode gerar somente um ou dois bytes de dados, que são transmitidos imediatamente. Por um link lento, muitos desses pacotes podem estar em trânsito pela rede ao mesmo tempo. O algoritmo de Nagle funciona combinando diversas mensagens de saída pequenas e enviando-as de uma só vez. Quando há um pacote enviado em relação ao qual o remetente não recebeu confirmação, esse remetente continua a armazenar a saída até ter um pacote completo, próprio para envio. Isso permite que a saída seja enviada toda de uma vez. O impacto da aplicação do algoritmo de Nagle é o aumento da largura de banda em detrimento da latência. Um aplicativo bem escrito que armazena envios em buffer internamente dispensa o uso do algoritmo de Nagle.
Quando um StreamSocket é criado, a configuração padrão estabelece que essa opção seja definida como true para desativar o algoritmo de Nagle. Essa configuração reduz possíveis atrasos no envio de mensagens de e-mail. Porém, se o StreamSocket for usado para um aplicativo que envia muitos pacotes de e-mail e cuja latência não seja um problema, o algoritmo de Nagle poderá ser habilitado para aumentar a eficiência.
O exemplo a seguir cria um StreamSocket e define o StreamSocketControl.NoDelay como false. Depois disso, o aplicativo poderá chamar outros métodos no StreamSocket que se conecta ao soquete.
var clientSocket = new Windows.Networking.Sockets.StreamSocket();
// The control object is associated with the socket
// Get the current setting for this option
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.NoDelay;
// Don't disable the nagle algorithm
clientSocket.Control.NoDelay = false;
// Now you can use the StreamSocket to call one of the
// ConnectAsync methods
Controles do soquete StreamSocketListener
O StreamSocketListener dá suporte à escuta para conexões de rede de entrada que usam um soquete de fluxo TCP. As opções avançadas no StreamSocketListener são limitadas a uma opção:
- StreamSocketListener.QualityOfService - A qualidade de serviço a ser definida em um objeto StreamSocket criado quando uma conexão é recebida pelo objeto StreamSocketListener.
A qualidade de serviço influencia a prioridade de threads para receber pacotes no objeto StreamSocket criado quando uma conexão é recebida pelo objeto StreamSocketListener. A qualidade de serviço pode ser definida como um de dois valores possíveis para a enumeração SocketQualityOfService. A configuração normal é a padrão quando um StreamSocket é criado no momento em que uma conexão é recebida. A configuração lowLatency aumenta a prioridade de threads para recebimento de pacotes no StreamSocket criado. Normalmente, essa opção é usada somente ao aceitar conexões para aplicativos de áudio ou semelhantes, que são muito precisos em relação ao tempo.
O exemplo a seguir cria um StreamSocketListener e define StreamSocketListener.QualityOfService como lowLatency para um aplicativo que depende de precisão temporal. Depois disso, o aplicativo poderá chamar outros métodos no StreamSocketListener para iniciar a escuta de solicitações de conexão de entrada.
var listenSocket = new Windows.Networking.Sockets.StreamSocketListener();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = listenSocket.Control.QualityOfService;
// Set quality of service to low latency
listenSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now you can use the StreamSocketListener to
// bind to a service name and begin listening for
// incoming connection requests
Comentários
Além de controlar dados, há um conjunto semelhante de classes relacionadas que fornecem acesso a mais informações de soquete sobre essas classes primárias:
- DatagramSocketInformation - Fornece informações de soquete sobre um objeto DatagramSocket.
- StreamSocketInformation - Fornece informações de soquete sobre um objeto StreamSocket.
- StreamSocketListenerInformation - Fornece informações de soquete sobre um objeto StreamSocketListener.
O modelo para acessar informações adicionais de soquete segue o mesmo design do acesso a dados de controle. O assunto abordado a seguir usa um StreamSocket como exemplo.
- Crie um StreamSocket.
- Use a propriedade StreamSocket.Information para obter a instância StreamSocketInformation associada ao objeto StreamSocket.
- Obtenha uma propriedade na instância StreamSocketInformation para recuperar informações de soquete adicionais.
Há uma diferença significativa entre as informações de soquete e as classes de controle de soquete. As propriedades em uma instância StreamSocketControl podem ser lidas ou gravadas (get ou set). Em contraste, as propriedades de uma instância StreamSocketInformation são somente leitura (get). Um aplicativo pode recuperar o valor de uma propriedade em uma instância StreamSocketControl ou StreamSocketInformation a qualquer momento após a criação do StreamSocket. Entretanto, um aplicativo deve sempre definir uma propriedade em uma instância StreamSocketControl antes de emitir uma operação de conexão ou que vincule o soquete.
Tópicos relacionados
Outro
Como se conectar com um soquete de datagrama
Como se conectar com um soquete de fluxo
Como proteger conexões de soquete com TLS/SSL
Referência