Condividi tramite


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

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:

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.

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:

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:

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:

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:

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.

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

Connessione con i socket

Come connettersi con un socket di datagramma

Come connettersi con un socket di flusso

Come proteggere le connessioni socket con TLS/SSL

Riferimento

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets