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
-
Ermöglicht die Netzwerkkommunikation mit Sockets und WebSockets.
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:
- DatagramSocketControl – Stellt Socketsteuerungsdaten für ein DatagramSocket-Objekt bereit.
- StreamSocketControl – Stellt Socketsteuerungsdaten für ein StreamSocket-Objekt bereit.
- StreamSocketListenerControl – Stellt Socketsteuerungsdaten für ein StreamSocketListener-Objekt bereit.
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.
- Erstellen Sie ein StreamSocket-Objekt.
- Verwenden Sie die StreamSocket.Control-Eigenschaft, um die StreamSocketControl-Instanz abzurufen, die einem StreamSocket-Objekt zugeordnet ist.
- Rufen Sie zum Festlegen einer erweiterten Socketoption eine Eigenschaft für StreamSocketControlab, oder legen Sie eine Eigenschaft fest.
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:
- DatagramSocketControl.QualityOfService – Die Dienstqualität eines DatagramSocket-Objekts.
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:
- StreamSocketControl.KeepAlive – Gibt an, ob für ein StreamSocket-Objekt Keep-Alive-Pakete an das Remoteziel gesendet werden.
- StreamSocketControl.NoDelay – Gibt an, ob für ein StreamSocket-Objekt der Nagle-Algorithmus verwendet wird.
- StreamSocketControl.OutboundBufferSizeInBytes – Steuert die Größe des Sendepuffers (in Bytes), der zum Senden von Daten für ein StreamSocket-Objekt verwendet wird.
- StreamSocketControl.QualityOfService – Die Dienstqualität eines StreamSocket-Objekts.
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:
- StreamSocketListener.QualityOfService – Die Dienstqualität, die für ein StreamSocket-Objekt festgelegt werden soll, das erstellt wird, wenn das StreamSocketListener-Objekt eine Verbindung empfängt.
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:
- DatagramSocketInformation – Stellt Socketinformationen für ein DatagramSocket-Objekt bereit.
- StreamSocketInformation – Stellt Socketinformationen für ein StreamSocket-Objekt bereit.
- StreamSocketListenerInformation – Stellt Socketinformationen für ein StreamSocketListener-Objekt bereit.
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.
- Erstellen Sie ein StreamSocket-Objekt.
- Verwenden Sie die StreamSocket.Information-Eigenschaft, um die StreamSocketInformation-Instanz abzurufen, die dem StreamSocket-Objekt zugeordnet ist.
- Rufen Sie eine Eigenschaft für die StreamSocketInformation-Instanz ab, um zusätzliche Socketinformationen abzurufen.
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
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