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
-
Habilita comunicaciones de red mediante el uso de sockets y WebSocket.
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:
- DatagramSocketControl: proporciona datos de control de socket en un objeto DatagramSocket.
- StreamSocketControl: proporciona datos de control de socket en un objeto StreamSocket.
- StreamSocketListenerControl: proporciona datos de control de socket en un objeto StreamSocketListener.
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.
- Crea un StreamSocket.
- Usa la propiedad StreamSocket.Control para obtener la instancia StreamSocketControl asociada con un objeto StreamSocket.
- Obtén o establece una propiedad en el StreamSocketControl para establecer una opción avanzada de socket.
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:
- DatagramSocketControl.QualityOfService: la calidad de servicio en un objeto DatagramSocket.
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:
- StreamSocketControl.KeepAlive: indica si los paquetes persistentes se envían al destino remoto en un objeto StreamSocket.
- StreamSocketControl.NoDelay: indica si el algoritmo Nagle se usa en un objeto StreamSocket.
- StreamSocketControl.OutboundBufferSizeInBytes: controla el tamaño, en bytes, del búfer de envío que se va a usar para enviar datos en un objeto StreamSocket.
- StreamSocketControl.QualityOfService: la calidad de servicio en un objeto 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:
- StreamSocketListener.QualityOfService: la calidad de servicio que se va a establecer en un objeto StreamSocket creado, cuando el objeto StreamSocketListener reciba una conexión.
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:
- DatagramSocketInformation: proporciona información de socket en un objeto DatagramSocket.
- StreamSocketInformation: proporciona información de socket en un objeto StreamSocket.
- StreamSocketListenerInformation: proporciona información de socket en un objeto StreamSocketListener.
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.
- Crea un StreamSocket.
- Usa la propiedad StreamSocket.Information para asociar la instancia StreamSocketInformation con un objeto StreamSocket.
- Obtén una propiedad en la instancia StreamSocketInformation para recuperar información adicional de socket.
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
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