Come usare i controlli avanzati dei socket (HTML)
[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]
Questo argomento mostra come usare i controlli avanzati dei socket con le funzionalità DatagramSocket, StreamSocket, StreamSocketListener per un'app di Windows Store.
Cosa sapere
Tecnologie
-
Consente la comunicazione in rete mediante socket e WebSocket.
Prerequisiti
- Gli esempi contenuti in questo argomento sono scritti in JavaScript. È consigliabile una conoscenza di base dei socket.
Panoramica sui controlli avanzati
Le classi DatagramSocket, StreamSocket e StreamSocketListener seguono tutte lo stesso modello per l'uso dei controlli avanzati. Ad ognuna delle classi principali menzionate sopra corrispondono classi correlate per l'accesso ai controlli avanzati:
- DatagramSocketControl: fornisce dati di controllo dei socket su un oggetto DatagramSocket.
- StreamSocketControl: fornisce dati di controllo dei socket su un oggetto StreamSocket.
- StreamSocketListenerControl: fornisce dati di controllo dei socket su un oggetto StreamSocketListener.
Il modello di base per l'uso di controlli avanzati è identico per le tre classi. Di seguito viene usata la classe StreamSocket come esempio, ma lo stesso processo può essere usato con DatagramSocket o StreamSocketListener.
- Creare un StreamSocket.
- Usare la proprietà StreamSocket.Control per ottenere l'istanza StreamSocketControl associata a un oggetto StreamSocket.
- Ottenere o impostare una proprietà su StreamSocketControl per impostare un'opzione socket avanzata.
L'app deve sempre impostare una proprietà su StreamSocketControl prima di eseguire un'operazione di connessione o un'operazione di associazione del socket. Per questo motivo, è preferibile impostare le opzioni avanzate immediatamente dopo la creazione del socket. Non provare a impostare una proprietà StreamSocketControl dopo che il socket ha chiamato uno dei metodi ConnectAsync.
Controlli dei socket di datagramma
DatagramSocket supporta le comunicazioni di rete mediante un socket di datagramma UDP. Le opzioni avanzate per DatagramSocket sono limitate a una sola opzione:
- DatagramSocketControl.QualityOfService: qualità del servizio su un oggetto DatagramSocket.
La qualità del servizio influisce sulla priorità dei thread per la ricezione di pacchetti sull'oggetto DatagramSocket. La qualità del servizio può essere impostata su uno dei due valori possibili per l'enumerazione SocketQualityOfService. normal è l'impostazione predefinita quando viene creato DatagramSocket. L'impostazione lowLatency aumenta la priorità dei thread per la ricezione di pacchetti. Questa opzione viene in genere usata solo per app audio o simili che richiedono tempi di risposta rapidi.
L'esempio seguente crea un DatagramSocket e imposta DatagramSocketControl.QualityOfService su lowLatency per un'app in cui il fattore temporale è importante. Al termine, l'app può chiamare altri metodi su DatagramSocket che associano o connettono il 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
Controlli dei socket StreamSocket
StreamSocket supporta le comunicazioni di rete mediante un socket di flusso TCP. Sono disponibili diverse opzioni avanzate per StreamSocket:
- StreamSocketControl.KeepAlive: indica se vengono inviati pacchetti keep-alive alla destinazione remota su un oggetto StreamSocket.
- StreamSocketControl.NoDelay: indica se viene usato l'algoritmo di Nagle su un oggetto StreamSocket.
- StreamSocketControl.OutboundBufferSizeInBytes: controlla le dimensioni, in byte, del buffer di invio da usare per inviare dati su un oggetto StreamSocket.
- StreamSocketControl.QualityOfService: qualità del servizio su un oggetto StreamSocket.
In questo esempio cambieremo la proprietà StreamSocketControl.NoDelay che controlla se l'algoritmo di Nagle è abilitato o disabilitato.
L'algoritmo di Nagle è una tecnica ideata per migliorare l'efficienza delle reti TCP/IP riducendo il numero di pacchetti che è necessario inviare tramite la rete. L'algoritmo tenta di gestire i problemi causati da un'applicazione che emette ripetutamente dati in piccoli blocchi. Un pacchetto TCP per IPv4 senza altre opzioni di intestazione ha un'intestazione da 40 byte (20 byte per IP e 20 per TCP). Quindi, se un'app invia solo 4 byte in un pacchetto, l'overhead sui dati del pacchetto è notevole. Questa situazione può verificarsi per un protocollo di accesso remoto (ad esempio telnet o Secure Shell) dove la maggior parte delle pressioni dei tasti genera solo uno o due byte di dati che vengono trasmessi immediatamente. Su un collegamento lento, è possibile che molti di questi pacchetti siano in transito sulla rete contemporaneamente. L'algoritmo di Nagle combina diversi piccoli messaggi in uscita e li invia tutti contemporaneamente. Se il mittente di un pacchetto inviato non riceve conferma, continua a memorizzare l'output nel buffer finché non ottiene l'output di un pacchetto completo. In questo modo l'output può essere inviato tutto in una volta. L'impatto dell'applicazione dell'algoritmo di Nagle è un aumento della larghezza di banda a discapito della latenza. Per un'app ben scritta che memorizza gli invii in buffer interni non è necessario usare l'algoritmo di Nagle.
Per impostazione predefinita, quando viene creato un oggetto StreamSocket, questa opzione è impostata su true per disabilitare l'algoritmo di Nagle. Questa impostazione riduce i potenziali ritardi con l'invio di piccoli messaggi. Se tuttavia StreamSocket viene usato per un'app che invia numerosi piccoli pacchetti e la latenza non costituisce un problema, è possibile abilitare l'algoritmo di Nagle per migliorare l'efficienza.
L'esempio seguente crea un StreamSocket e imposta StreamSocketControl.NoDelay su false. Al termine, l'app può chiamare altri metodi su StreamSocket che connettono il 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
Controlli dei socket StreamSocketListener
StreamSocketListener supporta l'ascolto di una connessione di rete in ingresso mediante un socket di flusso TCP. Le opzioni avanzate per StreamSocketListener sono limitate a una sola opzione:
- StreamSocketListener.QualityOfService: la qualità del servizio deve essere impostata su un oggetto StreamSocket creato quando l'oggetto StreamSocketListener riceve una connessione.
La qualità del servizio influisce sulla priorità dei thread per la ricezione dei pacchetti sull'oggetto StreamSocket creato quando l'oggetto StreamSocketListener riceve una connessione. La qualità del servizio può essere impostata su uno dei due valori possibili per l'enumerazione SocketQualityOfService. normal è l'impostazione predefinita quando viene creato un oggetto StreamSocket alla ricezione di una connessione. L'impostazione lowLatency aumenta la priorità dei thread per la ricezione di pacchetti sull'oggetto StreamSocket creato. Questa opzione viene in genere usata solo per accettare connessioni per app audio o simili che richiedono tempi di risposta rapidi.
L'esempio seguente crea un StreamSocketListener e imposta StreamSocketListener.QualityOfService su lowLatency per un'app in cui il fattore temporale è importante. Al termine, l'app può chiamare altri metodi su StreamSocketListener che iniziano l'ascolto di richieste di connessione in ingresso.
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
Osservazioni
Oltre ai dati di controllo, esiste un insieme di classi correlate simili che forniscono accesso ad altre informazioni sui socket in queste classi primarie:
- DatagramSocketInformation: fornisce informazioni relative ai socket su un oggetto DatagramSocket.
- StreamSocketInformation: fornisce informazioni relative ai socket su un oggetto StreamSocket.
- StreamSocketListenerInformation: fornisce informazioni relative ai socket su un oggetto StreamSocketListener.
Il modello per l'accesso ad altre informazioni sui socket segue la stessa struttura dell'accesso ai dati di controllo. Di seguito viene usato StreamSocket come esempio.
- Creare un StreamSocket.
- Usare la proprietà StreamSocket.Information per ottenere l'istanza StreamSocketInformation associata all'oggetto StreamSocket.
- Ottenere una proprietà sull'istanza StreamSocketInformation per recuperare altre informazioni sul socket.
Esiste una differenza significativa tra le classi di informazioni sui socket e quelle di controllo dei socket. Le proprietà su un'istanza StreamSocketControl sono leggibili o scrivibili (get o set). Al contrario, le proprietà su un'istanza StreamSocketInformation sono di sola lettura (get). Un'app può recuperare il valore di una proprietà su un'istanza StreamSocketControl o StreamSocketInformation in qualsiasi momento dopo la creazione di StreamSocket. Tuttavia, l'app deve sempre impostare una proprietà su un'istanza StreamSocketControl prima di eseguire un'operazione di connessione o un'operazione di associazione del socket.
Argomenti correlati
Other
Come connettersi con un socket di datagramma
Come connettersi con un socket di flusso
Come proteggere le connessioni socket con TLS/SSL
Riferimento