Compartir a través de


Cómo usar controles de sockets avanzados (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

En este tema se muestra cómo usar controles de sockets avanzados cuando se usan las características DatagramSocket, StreamSocket y StreamSocketListener en una aplicación de la Tienda Windows.

Lo que debes saber

Tecnologías

Requisitos previos

  • Los siguientes ejemplos de este tema se proporcionan en JavaScript. Se recomienda tener un conocimiento básico sobre sockets.

Introducción a controles avanzados

Las clases DatagramSocket, StreamSocket y StreamSocketListener respetan el mismo modelo en el uso de controles avanzados. Cada una de estas clases principales tiene clases relacionadas para acceder a controles avanzados:

El modelo básico para usar controles avanzados es el mismo para las tres clases. La descripción que sigue usa un StreamSocket como ejemplo, pero el mismo proceso puede aplicarse con un DatagramSocket o StreamSocketListener.

La aplicación siempre debe establecer una propiedad en el StreamSocketControl antes de emitir una operación de conexión o una operación que enlazará el objeto. Por ello, es mejor establecer todas las opciones avanzadas inmediatamente después de crear el socket. No intentes establecer una propiedad StreamSocketControl tras la llamada del socket a uno de los métodos ConnectAsync.

Controles de sockets de datagramas

DatagramSocket admite comunicaciones de red con un socket de datagramas UDP. La única opción avanzada en DatagramSocket es la siguiente:

La calidad de servicio afecta la prioridad de subproceso para recibir paquetes en el objeto DatagramSocket. La calidad de servicio puede establecerse en uno de los dos valores posibles para la enumeración SocketQualityOfService. La configuración predeterminada es normal cuando se crea un DatagramSocket. La configuración lowLatency aumenta la prioridad de subproceso para recibir paquetes. Esta opción normalmente solo se usaría para audio o aplicaciones similares que tienen alta distinción de tiempo.

El siguiente ejemplo crea un DatagramSocket y establece DatagramSocketControl.QualityOfService en lowLatency para una aplicación con distinción de tiempo. Una vez hecho esto, la aplicación puede llamar a otros métodos en el DatagramSocket para enlazar o conectar el socket.

    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 de sockets de StreamSocket

StreamSocket admite comunicaciones de red con un socket de secuencias UDP. Hay varias opciones avanzadas en StreamSocket:

En este ejemplo, cambiaremos la propiedad StreamSocketControl.NoDelay que controla si el algoritmo Nagle está habilitado o deshabilitado.

El algoritmo Nagle es una técnica que mejora la eficiencia de las redes TCP/IP al reducir la cantidad de paquetes que se necesitan enviar a través la red. Este algoritmo intenta solucionar problemas causados por una aplicación que envía datos repetidamente en fragmentos pequeños. Un paquete TCP para IPv4 sin otras opciones de encabezado tiene un encabezado de 40 bytes (20 bytes para la dirección IP y 20 bytes para TCP). Entonces si una aplicación envía solo 4 bytes en un paquete, la sobrecarga de datos es muy grande. Esto puede ocurrir en un protocolo de acceso remoto (telnet o shell seguro, por ejemplo), donde la mayoría de los eventos Keypress pueden generar uno o dos bytes de datos que se transmiten de forma inmediata. A través de un vínculo de baja velocidad, muchos de estos paquetes pueden estar en tránsito en la red al mismo tiempo. El algoritmo Nagle combina una cantidad de pequeños mensajes salientes y los envía todos juntos de una sola vez. Cuando el remitente no recibe la confirmación de un paquete enviado, mantiene el resultado de almacenamiento en búfer hasta tener todo el paquete disponible para la salida. Esto permite enviar todo de una vez. El impacto que genera la aplicación del algoritmo Nagle es el aumento del ancho de banda a costa de la latencia. Para una aplicación bien escrita enviada internamente por el búfer, no debería necesitarse el algoritmo Nagle.

Cuando se crea un StreamSocket, esta opción está configurada en true de manera predeterminada para deshabilitar el algoritmo Nagle. Esta configuración reduce las demoras que podrían producirse cuando se envían mensajes pequeños. No obstante, si el StreamSocket será usado por una aplicación que envía varios paquetes pequeños y la latencia no es un problema, entonces el algoritmo Nagle podría habilitarse para mejorar la eficiencia.

El siguiente ejemplo crea un StreamSocket y establece StreamSocketControl.NoDelay en false. Una vez hecho esto, la aplicación puede llamar a otros métodos en el StreamSocket para conectar el socket.

    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 de sockets de StreamSocketListener

StreamSocketListener admite la capacidad de escuchar una conexión de red entrante con un socket de secuencias TCP. La única opción avanzada en StreamSocketListener es la siguiente:

La calidad de servicio afecta la prioridad de subproceso para recibir paquetes en el objeto StreamSocket creado, cuando el objeto StreamSocketListener recibe una conexión. La calidad de servicio puede establecerse en uno de los dos valores posibles para la enumeración SocketQualityOfService. La configuración predeterminada es normal cuando se crea un StreamSocket al recibirse una conexión. La configuración lowLatency aumenta la prioridad de subproceso para recibir paquetes en el StreamSocket que se crea. Esta opción normalmente solo se usaría para aceptar conexiones de audio o aplicaciones similares que tienen alta distinción de tiempo.

El siguiente ejemplo crea un StreamSocketListener y establece StreamSocketListener.QualityOfService en lowLatency para una aplicación con distinción de tiempo. Una vez hecho esto, la aplicación puede llamar a otros métodos en el StreamSocketListener para comenzar a escuchar solicitudes de conexión entrante.

    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

Observaciones

Además de acceder a datos de control, se puede acceder a información adicional de socket mediante un conjunto de clases relacionadas con estas clases principales:

El modelo para acceder a información adicional de socket respeta el mismo diseño que el modelo para acceder a datos de control. La descripción a continuación usa un StreamSocket como ejemplo.

Hay una diferencia notable entre las clases de control de socket y de información de socket. Las propiedades en una instancia StreamSocketControl son de lectura o escritura (obtenidas o establecidas). Por el contrario, las propiedades en una instancia StreamSocketInformation son de solo lectura (obtenidas). Una aplicación puede recuperar el valor de una propiedad en una instancia StreamSocketControl o StreamSocketInformation en cualquier momento, tras haberse creado StreamSocket. No obstante, la aplicación siempre debe establecer una propiedad en una instancia StreamSocketControl antes de emitir una operación de conexión o una operación que enlazará el socket.

Temas relacionados

Otros

Conexión con sockets

Cómo conectar con un socket de datagramas

Cómo conectar con un socket de secuencias

Cómo proteger conexiones de sockets con TLS/SSL

Referencia

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets