Compartilhar via


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

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:

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.

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:

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:

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:

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:

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.

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

Conectando-se com soquetes

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

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets