Comment utiliser des contrôles de socket avancés (HTML)
[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]
Cette rubrique montre comment utiliser des contrôles de socket avancés lorsque les fonctionnalités DatagramSocket, StreamSocket et StreamSocketListener sont utilisées dans une application du Windows Store.
Ce que vous devez savoir
Technologies
-
Permet les communications réseau à l’aide de sockets et de WebSockets.
Prérequis
- Les exemples suivants fournis dans cette rubrique sont en langage JavaScript. Des connaissances de base sur les sockets sont recommandées.
Vue d’ensemble des contrôles avancés
Les classes DatagramSocket, StreamSocket et StreamSocketListener suivent toutes le même modèle en matière d’utilisation de contrôles avancés. À chacune des classes principales ci-dessus correspondent des classes associées permettant d’accéder à des contrôles avancés :
- DatagramSocketControl - Fournit des données de contrôle de socket sur un objet DatagramSocket.
- StreamSocketControl - Fournit des données de contrôle de socket sur un objet StreamSocket.
- StreamSocketListenerControl - Fournit des données de contrôle de socket sur un objet StreamSocketListener.
Le modèle de base pour l’utilisation des contrôles avancés est le même pour ces trois classes. Dans la discussion qui suit, StreamSocket est utilisé comme exemple, mais le même processus peut être utilisé avec DatagramSocket ou StreamSocketListener.
- Créez un objet StreamSocket.
- Utilisez la propriété StreamSocket.Control pour obtenir l’instance StreamSocketControl associée à un objet StreamSocket.
- Définissez ou obtenez une propriété sur l’objet StreamSocketControl afin de définir une option de socket avancée.
L’application doit toujours définir la propriété sur l’objet StreamSocketControl avant d’émettre une opération de connexion ou une opération qui liera le socket. Pour cette raison, il est préférable de définir les options avancées immédiatement après avoir créé le socket. N’essayez pas de définir une propriété StreamSocketControl après que le socket a appelé l’une des méthodes ConnectAsync.
Contrôles de socket de datagramme
DatagramSocket prend en charge la communication réseau à l’aide d’un socket de datagramme UDP. Les options avancées de DatagramSocket sont limitées à une seule option :
- DatagramSocketControl.QualityOfService - La qualité de service sur un objet DatagramSocket.
La qualité de service affecte la priorité du thread pour la réception de paquets sur l’objet DatagramSocket. Une des deux valeurs possibles pour l’énumération SocketQualityOfService peut être affectée à la qualité de service. Le paramètre normal est défini par défaut à la création d’un DatagramSocket. Le paramètre lowLatency augmente la priorité du thread pour la réception de paquets. Cette option ne doit en principe être utilisée que pour les applications audio ou similaires pour lesquelles la synchronisation est un facteur très important.
L’exemple suivant crée un DatagramSocket et affecte à DatagramSocketControl.QualityOfService la valeur lowLatency pour une application pour laquelle la synchronisation est importante. Après cela, l’application peut appeler d’autres méthodes sur le DatagramSocket pour lier ou connecter le 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
Contrôles de socket StreamSocket
L’objet StreamSocket prend en charge la communication réseau à l’aide d’un socket de flux TCP. Il existe plusieurs options avancées sur le StreamSocket :
- StreamSocketControl.KeepAlive - Indique si les paquets de persistance de connexion sont envoyés à la destination distante sur un objet StreamSocket.
- StreamSocketControl.NoDelay - Indique si l’algorithme de Nagle est utilisé sur un objet StreamSocket.
- StreamSocketControl.OutboundBufferSizeInBytes - Contrôle la taille, en octets, du tampon d’envoi à utiliser pour l’envoi de données sur un objet StreamSocket.
- StreamSocketControl.QualityOfService - La qualité de service sur un objet StreamSocket.
Dans cet exemple, nous allons modifier la propriété StreamSocketControl.NoDelay qui contrôle si l’algorithme de Nagle est activé ou désactivé.
L’algorithme de Nagle est une technique permettant d’améliorer l’efficacité des réseaux TCP/IP en réduisant le nombre de paquets qu’il est nécessaire d’envoyer sur le réseau. L’algorithme essaie de résoudre les problèmes causés par une application qui émet des données par petits morceaux de manière répétée. Un paquet TCP pour IPv4 sans autre option d’en-tête possède 40 octets (20 octets pour IP et 20 octets pour TCP). Par conséquent, si une application envoie seulement 4 octets dans un paquet, la surcharge de temps sur les données du paquet est très importante. Cela peut se produire avec un protocole d’accès à distance (telnet ou secure shell, par exemple) dans lequel chaque appui sur une touche génère généralement seulement un ou deux octets de données qui sont transmis immédiatement. Sur une liaison lente, un grand nombre de ces paquets peuvent être en transit simultanément sur le réseau. L’algorithme de Nagle combine plusieurs petits messages sortants et les envoie tous en même temps. Si l’expéditeur n’a reçu aucun accusé de réception pour un paquet envoyé, il conserve la sortie en mémoire tampon tant qu’il n’a pas obtenu un paquet entier qui vaille la peine d’être envoyé. La sortie peut ainsi être envoyée en une seule fois. Toutefois, l’algorithme de Nagle augmente la bande passante aux dépens de la latence. Une application bien écrite qui met en mémoire tampon les envois en interne ne devrait pas avoir besoin d’utiliser l’algorithme de Nagle.
Lors de la création d’un objet StreamSocket, cette option a la valeur true par défaut, ce qui désactive l’algorithme de Nagle et réduit les retards potentiels lors de l’envoi de petits messages. Toutefois, si le StreamSocket est utilisé pour une application qui envoie de nombreux petits paquets et que la latence n’est pas un problème, l’algorithme de Nagle peut être activé pour une plus grande efficacité.
L’exemple suivant crée un objet StreamSocket et affecte à StreamSocketControl.NoDelay la valeur false. Après cela, l’application peut appeler d’autres méthodes sur le StreamSocket pour connecter le 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
Contrôles de socket StreamSocketListener
L’objet StreamSocketListener prend en charge l’écoute d’une connexion réseau entrante à l’aide d’un socket de flux TCP. Les options avancées sur le StreamSocketListener sont limitées à une seule option :
- StreamSocketListener.QualityOfService - La qualité de service à définir sur un objet StreamSocket créé lorsqu’une connexion est reçue par l’objet StreamSocketListener.
La qualité de service affecte la priorité du thread pour la réception de paquets sur l’objet StreamSocket créé lorsqu’une connexion est reçue par l’objet StreamSocketListener. Une des deux valeurs possibles pour l’énumération SocketQualityOfService peut être affectée à la qualité de service. Lors de la création d’un StreamSocket lors de la réception d’une connexion, le paramètre normal est affecté par défaut. Le paramètre lowLatency améliore la priorité du thread pour la réception de paquets sur le StreamSocket qui est créé. Cette option est normalement utilisée uniquement lors de l’acceptation de connexions pour des applications audio ou vidéo pour lesquelles la synchronisation est très importante.
L’exemple suivant crée un objet StreamSocketListener et affecte à StreamSocketListener.QualityOfService la valeur lowLatency pour une application pour laquelle la synchronisation est importante. Après cela, l’application peut appeler d’autres méthodes sur le StreamSocketListener pour commencer à écouter des demandes de connexion entrantes.
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
Remarques
Outre les données de contrôle, il existe un ensemble similaire de classes associées qui donnent accès à des informations de socket supplémentaires sur ces classes principales :
- DatagramSocketInformation - Fournit des informations de socket sur un objet DatagramSocket.
- StreamSocketInformation - Fournit des informations de socket sur un objet StreamSocket.
- StreamSocketListenerInformation - Fournit des informations de socket sur un objet StreamSocketListener.
Le modèle d’accès à des informations de socket supplémentaires est identique au modèle d’accès aux données de contrôle. Un StreamSocket est utilisé comme exemple dans la discussion ci-dessous.
- Créez un objet StreamSocket.
- Utilisez la propriété StreamSocket.Information pour obtenir l’instance StreamSocketInformation associée à l’objet StreamSocket.
- Obtenez une propriété sur l’instance StreamSocketInformation pour récupérer des informations de socket supplémentaires.
Il existe une grande différence entre les informations de socket et les classes de contrôle de socket. Les propriétés sur une instance StreamSocketControl peuvent être lues et écrites (get ou set). À l’inverse, les propriétés sur une instance StreamSocketInformation sont en lecture seule (get). Une application peut récupérer la valeur d’une propriété sur une instance StreamSocketControl ou StreamSocketInformation à tout moment après la création de StreamSocket. Toutefois, une application doit toujours définir une propriété sur une instance StreamSocketControl avant de lancer une opération de connexion ou une opération qui liera le socket.
Rubriques associées
Autre
Comment établir une connexion à l’aide d’un socket datagramme
Comment établir une connexion à l’aide d’un socket de flux
Comment sécuriser des connexions de socket avec TLS/SSL
Référence