Freigeben über


So wird’s gemacht: Verwenden erweiterter Socketsteuerelemente (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

In diesem Thema wird gezeigt, wie Sie in Verbindung mit den Features DatagramSocket, StreamSocket und StreamSocketListener erweiterte Socketsteuerelemente für eine Windows Store-App verwenden können.

Wissenswertes

Technologien

Voraussetzungen

  • Die folgenden Beispiele in diesem Thema sind in JavaScript verfasst. Grundkenntnisse im Bereich Sockets werden empfohlen.

Übersicht über erweiterte Steuerelemente

Die Klassen DatagramSocket, StreamSocket und StreamSocketListener folgen alle dem gleichen Modell für die Verwendung erweiterter Steuerelemente. Den zuvor genannten Hauptklassen entsprechen verwandte Klassen für den Zugriff auf erweiterte Steuerelemente:

Das Grundmodell für die Verwendung erweiterter Steuerelemente ist für alle drei Klassen gleich. In der folgenden Erläuterung wird exemplarisch ein StreamSocket-Objekt verwendet, der gleiche Prozess kann jedoch auch mit einem Objekt vom Typ DatagramSocket oder StreamSocketListener ausgeführt werden.

Die App muss vor dem Ausgeben eines Verbindungsvorgangs oder eines Vorgangs, der den Socket bindet, immer eine Eigenschaft für StreamSocketControl festlegen. Daher empfiehlt es sich, erweiterte Optionen direkt nach der Socketerstellung festzulegen. Versuchen Sie nicht, eine StreamSocketControl-Eigenschaft festzulegen, nachdem ein Socket eine der ConnectAsync-Methoden aufgerufen hat.

Socketsteuerelemente für das Datagramm

Das DatagramSocket-Objekt unterstützt Netzwerkkommunikation über einen UDP-Datagrammsocket. Für DatagramSocket steht lediglich eine einzelne erweiterte Option zur Verfügung:

Die Dienstqualität hat Auswirkungen auf die Threadpriorität beim Empfangen von Paketen für das DatagramSocket-Objekt. Die Dienstqualität kann auf einen von zwei möglichen Werten für die SocketQualityOfService-Enumeration festgelegt werden. Die Einstellung normal ist die Standardeinstellung beim Erstellen eines Objekts vom Typ DatagramSocket. Die Einstellung lowLatency erhöht die Threadpriorität für den Paketempfang. Diese Option wird üblicherweise nur für Audio-Apps oder ähnlich timingkritische Apps verwendet.

Das folgende Beispiel erstellt ein DatagramSocket-Objekt und legt DatagramSocketControl.QualityOfService für eine zeitkritische App auf lowLatency fest. Anschließend kann die App weitere Methoden für das DatagramSocket-Objekt aufrufen, um den Socket zu (ver-)binden.

    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

Socketsteuerelemente für StreamSocket

Das StreamSocket-Objekt unterstützt Netzwerkkommunikation über einen TCP-Streamsocket. Für StreamSocket stehen mehrere erweiterte Optionen zur Verfügung:

In diesem Beispiel ändern wir die StreamSocketControl.NoDelay-Eigenschaft, die den Aktivierungsstatus des Nagle-Algorithmus steuert.

Der Nagle-Algorithmus verbessert die Effizienz von TCP/IP-Netzwerken. Hierzu wird die Anzahl von Paketen verringert, die über das Netzwerk gesendet werden müssen. Der Algorithmus versucht, die Probleme auszugleichen, die durch eine Anwendung entstehen, die wiederholt Daten in kleinen Blöcken sendet. Ein TCP-Paket für IPv4 ohne weitere Headeroptionen verfügt über einen 40-Byte-Header (20 Bytes für IP und 20 Bytes für TCP). Sendet eine App in einem Paket also nur 4 Bytes, fällt ein hoher Zusatzaufwand für die Paketdaten an. Dieser Fall kann beispielsweise bei einem Remotezugriffsprotokoll (wie Telnet oder Secure Shell) auftreten, bei dem die meisten Tastendruckvorgänge unter Umständen lediglich bis zu zwei Bytes an Daten erzeugen, die umgehend übertragen werden. Bei einer langsamen Verbindung sind ggf. viele dieser Pakete gleichzeitig im Netzwerk unterwegs. Der Nagle-Algorithmus fasst einige kleine ausgehende Meldungen zusammen und sendet sie alle auf einmal. Ist ein gesendetes Paket vorhanden, für das der Absender keine Bestätigung erhalten hat, puffert der Absender die Ausgabe so lange, bis genügend Ausgabedaten für ein vollständiges Paket zusammengekommen sind. Dadurch können die Ausgaben alle auf einmal gesendet werden. Der Effekt des Nagle-Algorithmus ist eine Erhöhung der Bandbreite bei gleichzeitiger Erhöhung der Latenz. Eine gut geschriebene App mit interner Pufferung von Sendevorgängen benötigt eigentlich keinen Nagle-Algorithmus.

Standardmäßig ist diese Option bei Erstellung eines StreamSocket-Objekts auf true festgelegt, um den Nagle-Algorithmus zu deaktivieren. Diese Einstellung verringert die Gefahr, dass es beim Senden kleiner Meldungen zu Verzögerungen kommt. Falls StreamSocket allerdings für eine App verwendet wird, die viele kleine Pakete sendet, und die Latenz keine Rolle spielt, kann der Nagle-Algorithmus ggf. aktiviert werden, um die Effizienz zu verbessern.

Das folgende Beispiel erstellt ein StreamSocket-Objekt und legt StreamSocketControl.NoDelay auf false fest. Anschließend kann die App weitere Methoden für StreamSocket aufrufen, um den Socket zu verbinden.

    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

Socketsteuerelemente für StreamSocketListener

StreamSocketListener unterstützt das Lauschen auf eine eingehende Netzwerkverbindung unter Verwendung eines TCP-Streamsockets. Für StreamSocketListener steht lediglich eine einzelne erweiterte Option zur Verfügung:

Die Dienstqualität hat Auswirkungen auf die Threadpriorität beim Empfangen von Paketen für das StreamSocket-Objekt, das erstellt wird, wenn das StreamSocketListener-Objekt eine Verbindung empfängt. Die Dienstqualität kann auf einen von zwei möglichen Werten für die SocketQualityOfService-Enumeration festgelegt werden. Bei der Erstellung eines StreamSocket-Objekts aufgrund einer empfangenen Verbindung wird die Standardeinstellung normal verwendet. Die Einstellung lowLatency erhöht die Threadpriorität für den Paketempfang des erstellten StreamSocket-Objekts. Diese Option wird üblicherweise nur beim Akzeptieren von Verbindungen für Audio-Apps oder ähnlich timingkritische Apps verwendet.

Das folgende Beispiel erstellt ein StreamSocketListener-Objekt und legt StreamSocketListener.QualityOfService für eine zeitkritische App auf lowLatency fest. Anschließend kann die App weitere Methoden für StreamSocketListener aufrufen, um mit dem Lauschen auf eingehende Verbindungsanforderungen zu beginnen.

    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

Anmerkungen

Darüber hinaus gibt es eine ähnliche Gruppe von verwandten Klassen, die den Zugriff auf weitere Socketinformationen für diese Hauptklassen ermöglichen:

Das Modell für den Zugriff auf zusätzliche Socketinformationen besitzt das gleiche Design wie das Modell für den Zugriff auf Steuerungsdaten. In der folgenden Erläuterung wird exemplarisch ein StreamSocket-Objekt verwendet.

Zwischen den Socketinformations- und den Socketsteuerungsklassen gibt es einen deutlichen Unterschied. Die Eigenschaften für eine StreamSocketControl-Instanz sind lesbar oder schreibbar ("get" oder "set"). Die Eigenschaften für eine StreamSocketInformationInstanz sind dagegen schreibgeschützt ("get"). Eine App kann den Wert einer Eigenschaft für eine Instanz vom Typ StreamSocketControl oder StreamSocketInformation jederzeit nach Erstellung von StreamSocket abrufen. Eine App muss jedoch vor dem Ausgeben eines Verbindungsvorgangs oder eines Vorgangs, der den Socket bindet, immer eine Eigenschaft für eine StreamSocketControl-Instanz festlegen.

Verwandte Themen

Sonstige

Verbinden mit Sockets

So wird's gemacht: Herstellen einer Verbindung mit einem Datagrammsocket

So wird's gemacht: Herstellen einer Verbindung mit einem Streamsocket

So wird's gemacht: Schützen von Socketverbindungen mit TLS/SSL

Referenz

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets