Netzwerk für SpieleNetworking for games

Erfahren Sie, wie Sie Netzwerkfeatures entwickeln und in ein DirectX-Spiel integrieren.Learn how to develop and incorporate networking features into your DirectX game.

Konzepte auf einen BlickConcepts at a glance

Unabhängig davon, ob es sich um ein einfaches eigenständiges Spiel oder ein umfangreiches Multiplayer-Spiel handelt, können für DirectX-Spiele verschiedene Netzwerkfeatures verwendet werden.A variety of networking features can be used in your DirectX game, whether it is a simple standalone game to massively multi-player games. Das einfachste Netzwerkfeature dient zum Speichern von Benutzernamen und Spielständen auf einem zentralen Netzwerkserver.The simplest use of networking would be to store user names and game scores on a central network server.

Netzwerk-APIs werden für Multiplayer-Spiele mit Infrastrukturmodell (Client-Server oder Peer-zu-Peer über das Internet) sowie für Ad-hoc-Spiele (lokales Peer-zu-Peer) benötigt.Networking APIs are needed in multi-player games that use the infrastructure (client-server or internet peer-to-peer) model and also by ad hoc (local peer-to-peer) games. Bei serverbasierten Multiplayer-Spielen erfolgen die meisten Spielvorgänge in der Regel auf einem zentralen Spielserver, und die Client-Spiel-App wird für Eingaben, die Grafikanzeige, die Audiowiedergabe und weitere Features verwendet.For server-based multi-player games, a central game server usually handles most of the game operations and the client game app is used for input, displaying graphics, playing audio, and other features. Die Geschwindigkeit und Latenz von Netzwerkübertragungen sind entscheidend für ein ansprechendes Spielerlebnis.The speed and latency of network transfers is a concern for a satisfactory game experience.

Bei Peer-zu-Peer-Spielen werden die Eingaben und Grafiken in der App jedes Spielers verarbeitet.For peer-to-peer games, each player's app handles the input and graphics. In den meisten Fällen sind die Spieler nicht weit voneinander entfernt, sodass die Netzwerklatenz zwar niedriger ist, aber dennoch eine Rolle spielt.In most cases, the game players are located in close proximity so that network latency should be lower but is still a concern. In diesem Fall ist es wichtig, wie Mitspieler gefunden werden und eine Verbindung mit ihnen hergestellt wird.How to discovery peers and establish a connection becomes a concern.

Bei Spielen mit einem Spieler wird oft ein zentraler Webserver oder -service zum Speichern von Benutzernamen, Spielständen und weiteren Informationen verwendet.For single-player games, a central Web server or service is often used to store user names, game scores, and other miscellaneous information. Bei diesen Spielen stellt die Geschwindigkeit und Latenz von Netzwerkübertragungen in der Regel kein Problem dar, da die Spielvorgänge nicht unmittelbar damit zusammenhängen.In these games, the speed and latency of networking transfers is less of a concern since it doesn't directly affect game operation.

Netzwerkbedingungen können sich jederzeit ändern, sodass jedes Spiel, für das Netzwerk-APIs verwendet werden, eventuell auftretende Netzwerkausnahmen behandeln muss.Network conditions can change at any time, so any game that uses networking APIs needs to handle network exceptions that may occur. Weitere Informationen zum Behandeln von Netzwerkausnahmen finden Sie unter Grundlagen zum Netzwerk.To learn more about handling network exceptions, see Networking basics.

Firewalls und Webproxys werden häufig verwendet und können die Verwendung von Netzwerkfeatures beeinträchtigen.Firewalls and web proxies are common and can affect the ability to use networking features. In einem Spiel über ein Netzwerk müssen Firewalls und Proxys ordnungsgemäß verarbeitet werden können.A game that uses networking needs to be prepared to properly handle firewalls and proxies.

Bei mobilen Geräten ist es wichtig, verfügbare Netzwerkressourcen zu überwachen und in getakteten Netzwerken entsprechend zu reagieren, da Roaming-oder Datenkosten anfallen können.For mobile devices, it is important to monitor available network resources and behave accordingly when on metered networks where roaming or data costs can be significant.

Die Netzwerkisolation ist Teil des von Windows verwendeten App-Sicherheitsmodells.Network isolation is part of the app security model used by Windows. Unter Windows werden Netzwerkgrenzen aktiv erkannt und Netzwerkzugriffsbeschränkungen für die Netzwerkisolation erzwungen.Windows actively discovers network boundaries and enforces network access restrictions for network isolation. Apps müssen Netzwerkisolationsfunktionen deklarieren, um den Umfang des Netzwerkzugriffs festzulegen.Apps must declare network isolation capabilities in order to define the scope of network access. Ohne Deklaration dieser Funktionen hat Ihre App keinen Zugriff auf Netzwerkressourcen.Without declaring these capabilities, your app will not have access to network resources. Unter Konfigurieren von Netzwerkisolationsfunktionen finden Sie weitere Informationen zur Erzwingung der Netzwerkisolation für Apps durch Windows.To learn more about how Windows enforces network isolation for apps, see How to configure network isolation capabilities.

Überlegungen zum EntwurfDesign considerations

In DirectX-Spielen können verschiedene Netzwerk-APIs verwendet werden.A variety of networking APIs can be used in DirectX games. Daher ist es wichtig, die richtige API auszuwählen.So, it is important to pick the right API. Windows unterstützt verschiedene Netzwerk-APIs, die Ihre App für die Kommunikation mit anderen Computern und Geräten entweder über das Internet oder private Netzwerke nutzen kann.Windows supports a variety of networking APIs that your app can use to communicate with other computers and devices over either the Internet or private networks. Sie müssen zunächst ermitteln, welche Netzwerkfeatures Ihre App erfordert.Your first step is to figure out what networking features your app needs.

Dies sind die beliebtesten Netzwerk-APIs für Spiele.These are the more popular network APIs for games.

  • TCP und Sockets – sorgen für eine zuverlässige Verbindung.TCP and sockets - Provides a reliable connection. Verwenden Sie TCP für Spielvorgänge, die keine Sicherheit erfordern.Use TCP for game operations that don’t need security. TCP ermöglicht eine einfache Skalierung des Servers, daher wird es häufig in Spielen mit dem Infrastruktur (Client-Server oder Peer-zu-Peer über das Internet)-Modell verwendet.TCP allows the server to easily scale, so it is commonly used in games that use the infrastructure (client-server or internet peer-to-peer) model. TCP kann auch für Ad-hoc-Spiele (lokales Peer-zu-Peer) über Wi-Fi Direct und Bluetooth verwendet werden.TCP can also be used by ad hoc (local peer-to-peer) games over Wi-Fi Direct and Bluetooth. TCP wird in der Regel für die Bewegung von Spielobjekten, die Interaktion zwischen Spielfiguren, Textchat und andere Vorgänge verwendet.TCP is commonly used for game object movement, character interaction, text chat, and other operations. Die Streamsocket -Klasse stellt einen TCP-Socket bereit, der in Microsoft Store spielen verwendet werden kann.The StreamSocket class provides a TCP socket that can be used in Microsoft Store games. Die StreamSocket-Klasse wird zusammen mit verwandten Klassen im Windows::Networking::Sockets-Namespace verwendet.The StreamSocket class is used with related classes in the Windows::Networking::Sockets namespace.
  • TCP und Sockets mit SSL – sorgen für zuverlässige Verbindung und verhindern Mitverfolgung.TCP and sockets using SSL - Provides a reliable connection that prevents eavesdropping. Verwenden Sie TCP-Verbindungen mit SSL für Spielvorgänge, die Sicherheit erfordern.Use TCP connections with SSL for game operations that need security. Die Verschlüsselung und der Mehraufwand von SSL erhöht die Latenz- und Leistungskosten, daher wird SSL nur verwendet, wenn Sicherheit erforderlich ist.The encryption and overhead of SSL adds a cost in latency and performance, so it is only used when security is needed. TCP mit SSL wird in der Regel für Anmelde-, Kauf- und Handelsressourcen sowie die Erstellung und Verwaltung von Spielfiguren verwendet.TCP with SSL is commonly used for login, purchasing and trading assets, game character creation and management. Die StreamSocket-Klasse bietet einen TCP-Socket, der SSL unterstützt.The StreamSocket class provides a TCP socket that supports SSL.
  • UDP und Sockets – bieten unzuverlässige Netzwerkübertragungen mit wenig Mehraufwand.UDP and sockets - Provides unreliable network transfers with low overhead. UDP wird für Spielvorgänge verwendet, die niedrige Latenz erfordern und Paketverluste tolerieren können.UDP is used for game operations that require low latency and can tolerate some packet loss. Dies wird häufig für Kampfspiele, Schießen mit Leuchtspur, Netzwerkaudio und Sprachchat verwendet.This is often used for fighting games, shooting and tracers, network audio, and voice chat. Die DatagramSocket -Klasse stellt einen UDP-Socket bereit, der in Microsoft Store spielen verwendet werden kann.The DatagramSocket class provides a UDP socket that can be used in Microsoft Store games. Die DatagramSocket-Klasse wird zusammen mit verwandten Klassen im Windows::Networking::Sockets-Namespace verwendet.The DatagramSocket class is used with related classes in the Windows::Networking::Sockets namespace.
  • HTTP-Client – stellt eine zuverlässige Verbindung mit HTTP-Servern bereit.HTTP Client - Provides a reliable connection to HTTP servers. Das gängigste Netzwerkszenario ist der Zugriff auf eine Website, um Informationen abzurufen oder zu speichern.The most common networking scenario is to access a web site to retrieve or store information. Ein einfaches Beispiel dafür ist ein Spiel, das eine Website zum Speichern von Benutzerinformationen und Spielständen verwendet.A simple example would be a game that uses a website to store user information and game scores. Wenn ein HTTP-Client zusammen mit SSL für die Sicherheit verwendet wird, kann er für Anmelde-, Kauf- und Handelsressourcen sowie die Erstellung und Verwaltung von Spielfiguren verwendet werden.When used with SSL for security, an HTTP client can be used for login, purchasing, trading assets, game character creation, and management. Die HttpClient -Klasse stellt eine moderne HTTP-Client-API für die Verwendung in Microsoft Store Spielen bereit.The HttpClient class provides a modern HTTP client API for use in Microsoft Store games. Die HttpClient-Klasse wird zusammen mit verwandten Klassen im Windows::Web::Http-Namespace verwendet.The HttpClient class is used with related classes in the Windows::Web::Http namespace.

Behandeln von Netzwerkausnahmen in einem DirectX-SpielHandling network exceptions in your DirectX game

Wenn in Ihrem DirectX-Spiel eine Netzwerkausnahme auftritt, weist dies auf ein erhebliches Problem oder einen Fehler hin.When a network exception occurs in your DirectX game, this indicates a significant problem or failure. Ausnahmen können bei der Nutzung von Netzwerk-APIs viele Gründe haben.Exceptions can occur for many reasons when using networking APIs. Häufig ergeben sich Ausnahmen aus Änderungen bei der Netzwerkverbindung oder anderen Netzwerkproblemen mit dem Remotehost oder Server.Often, the exception can result from changes in network connectivity or other networking issues with the remote host or server.

Bei der Verwendung von Netzwerk-APIs können beispielsweise aus folgenden Gründen Ausnahmen auftreten:Some causes of exceptions when using networking APIs include the following:

  • Die Eingabe des Benutzers für einen Hostnamen oder einen URI enthält Fehler und ist ungültig.Input from the user for a hostname or a URI contains errors and is not valid.
  • Fehler bei der Namensauflösung beim Suchen nach einem Hostnamen oder URIName resolutions failures when looking up a hostname or a URi.
  • Verlust oder Änderung der NetzwerkverbindungLoss or change in network connectivity.
  • Netzwerkverbindungsfehler mit Sockets oder HTTP-Client-APIsNetwork connection failures using sockets or the HTTP client APIs.
  • Netzwerkserver- oder RemoteendpunktfehlerNetwork server or remote endpoint errors.
  • Andere NetzwerkfehlerMiscellaneous networking errors.

Ausnahmen aufgrund von Netzwerkfehlern (z. B. Unterbrechung oder Änderung der Netzwerkverbindung, Verbindungsfehler und Serverfehler) können jederzeit auftreten.Exceptions from network errors (for example, loss or change of connectivity, connection failures, and server failures) can happen at any time. Diese Fehler haben zur Folge, dass Ausnahmen ausgelöst werden.These errors result in exceptions being thrown. Wenn eine Ausnahme nicht von Ihrer App behandelt wird, kann sie dazu führen, dass die gesamte App von der Runtime beendet wird.If an exception is not handled by your app, it can cause your entire app to be terminated by the runtime.

Beim Aufrufen der meisten asynchronen Netzwerkmethoden müssen Sie Code zum Behandeln von Ausnahmen schreiben.You must write code to handle exceptions when you call most asynchronous network methods. In manchen Fällen kann versucht werden, eine Netzwerkmethode beim Auftreten einer Ausnahme zu wiederholen, um das Problem zu beheben.Sometimes, when an exception occurs, a network method can be retried as a way to resolve the problem. In anderen Fällen muss die App ohne Netzwerkverbindung mit zuvor zwischengespeicherten Daten weiter ausgeführt werden.Other times, your app may need to plan to continue without network connectivity using previously cached data.

UWP-Apps (Universelle Windows-Plattform) lösen im Allgemeinen nur eine Ausnahme aus.Universal Windows Platform (UWP) apps generally throw a single exception. Ihr Ausnahmehandler kann detailliertere Informationen zur Ursache abrufen, um die Ausnahme besser verstehen und entsprechende Entscheidungen treffen zu können.Your exception handler can retrieve more detailed information about the cause of the exception to better understand the failure and make appropriate decisions.

Wenn eine Ausnahme in einem DirectX-Spiel auftritt, bei dem es sich um eine UWP-App handelt, kann der HRESULT-Wert zur Ermittlung der Fehlerursache abgerufen werden.When an exception occurs in a DirectX game that is a UWP app, the HRESULT value for the cause of the error can be retrieved. Die Winerror.h-Includedatei enthält eine umfangreiche Liste möglicher HRESULT-Werte, die Netzwerkfehler umfasst.The Winerror.h include file contains a large list of possible HRESULT values that includes network errors.

Die Netzwerk-APIs unterstützen verschiedene Methoden zum Abrufen der detaillierten Informationen zur Ursache der Ausnahme.The networking APIs support different methods for retrieving this detailed information about the cause of an exception.

  • Eine Methode zum Abrufen des HRESULT-Werts des Fehlers, der die Ausnahme verursacht hat.A method to retrieve the HRESULT value of the error that caused the exception. Die mögliche Liste potenzieller HRESULT-Werte ist lang und nicht spezifiziert.The possible list of potential HRESULT values is large and unspecified. Der HRESULT-Wert kann abgerufen werden, wenn eine der Netzwerk-APIs verwendet wird.The HRESULT value can be retrieved when using any of the networking APIs.
  • Eine Hilfsmethode, die den HRESULT-Wert in einen Enumerationswert konvertiert.A helper method that converts the HRESULT value to an enumeration value. Die Liste der möglichen Enumerationswerte ist spezifiziert und relativ kurz.The list of possible enumeration values is specified and relatively small. Eine Hilfsmethode für die Socketklassen ist in Windows::Networking::Sockets verfügbar.A helper method is available for the socket classes in the Windows::Networking::Sockets.

Ausnahmen in „Windows.Networking.Sockets“Exceptions in Windows.Networking.Sockets

Der Konstruktor für die HostName-Klasse in Verbindung mit Sockets kann eine Ausnahme auslösen, wenn die übergebene Zeichenfolge kein gültiger Hostname ist (enthält Zeichen, die in einem Hostnamen nicht zulässig sind).The constructor for the HostName class used with sockets can throw an exception if the string passed is not a valid hostname (contains characters that are not allowed in a host name). Wenn eine App vom Benutzer eine Eingabe für das HostName-Element einer Peerverbindung zum Spielen erhält, sollte sich der Konstruktor innerhalb eines try/catch-Blocks befinden.If an app gets input from the user for the HostName for a peer connection for gaming, the constructor should be in a try/catch block. Wenn eine Ausnahme ausgelöst wird, kann die App den Benutzer benachrichtigen und einen neuen Hostnamen anfordern.If an exception is thrown, the app can notify the user and request a new hostname.

Hinzufügen von Code zum Überprüfen einer Zeichenfolge für einen Hostnamen vom BenutzerAdd code to validate a string for a hostname from the user

// Define some variables at the class level.
Windows::Networking::HostName^ remoteHost;

bool isHostnameFromUser = false;
bool isHostnameValid = false;

///...

// If the value of 'remoteHostname' is set by the user in a control as input 
// and is therefore untrusted input and could contain errors. 
// If we can't create a valid hostname, we notify the user in statusText 
// about the incorrect input.

String ^hostString = remoteHostname;

try 
{
    remoteHost = ref new Windows::Networking:Host(hostString);
    isHostnameValid = true;
}
catch (InvalidArgumentException ^ex)
{
    statusText->Text = "You entered a bad hostname, please re-enter a valid hostname.";
    return;
}

isHostnameFromUser = true;

// ... Continue with code to execute with a valid hostname.

Der Windows.Networking.Sockets-Namespace enthält praktische Hilfsmethoden und Enumerationen für die Behandlung von Fehlern bei der Verwendung von Sockets.The Windows.Networking.Sockets namespace has convenient helper methods and enumerations for handling errors when using sockets. Mit ihnen lassen sich spezifische Netzwerkausnahmen in der App unterschiedlich behandeln.This can be useful for handling specific network exceptions differently in your app.

Ein Fehler, der für einen DatagramSocket-, StreamSocket- oder StreamSocketListener-Vorgang auftritt, führt zur Auslösung einer Ausnahme.An error encountered on DatagramSocket, StreamSocket, or StreamSocketListener operation results in an exception being thrown. Die Ursache der Ausnahme ist ein Fehlerwert, der als HRESULT-Wert dargestellt wird.The cause of the exception is an error value represented as an HRESULT value. Mit der SocketError.GetStatus-Methode wird ein Netzwerkfehler aus einem Socketvorgang in einen SocketErrorStatus-Enumerationswert konvertiert.The SocketError.GetStatus method is used to convert a network error from a socket operation to a SocketErrorStatus enumeration value. Die meisten SocketErrorStatus-Enumerationswerte entsprechen einem vom systemeigenen Windows Sockets-Vorgang zurückgegebenen Fehler.Most of the SocketErrorStatus enumeration values correspond to an error returned by the native Windows sockets operation. Eine App kann nach bestimmten SocketErrorStatus-Enumerationswerten filtern, um das App-Verhalten je nach Ausnahmeursache zu ändern.An app can filter on specific SocketErrorStatus enumeration values to modify app behavior depending on the cause of the exception.

Bei Parameterprüfungsfehlern kann eine App den HRESULT-Wert aus der Ausnahme auch verwenden, um ausführlichere Informationen zum zugehörigen Fehler zu erhalten.For parameter validation errors, an app can also use the HRESULT from the exception to learn more detailed information about the error that caused the exception. Mögliche HRESULT-Werte sind in der Headerdatei Winerror.h aufgeführt.Possible HRESULT values are listed in the Winerror.h header file. Bei den meisten Parameter Validierungs Fehlern lautet der zurückgegebene HRESULT E _ invalidArg.For most parameter validation errors, the HRESULT returned is E_INVALIDARG.

Hinzufügen von Code zum Behandeln von Ausnahmen beim Herstellen einer StreamsocketverbindungAdd code to handle exceptions when trying to make a stream socket connection

using namespace Windows::Networking;
using namespace Windows::Networking::Sockets;
    
    // Define some more variables at the class level.

    bool isSocketConnected = false
    bool retrySocketConnect = false;

    // The number of times we have tried to connect the socket.
    unsigned int retryConnectCount = 0;

    // The maximum number of times to retry a connect operation.
    unsigned int maxRetryConnectCount = 5; 
    ///...

    // We pass in a valid remoteHost and serviceName parameter.
    // The hostname can contain a name or an IP address.
    // The servicename can contain a string or a TCP port number.

    StreamSocket ^ socket = ref new StreamSocket();
    SocketErrorStatus errorStatus; 
    HResult hr;

    // Save the socket, so any subsequent steps can use it.
    CoreApplication::Properties->Insert("clientSocket", socket);

    // Connect to the remote server. 
    create_task(socket->ConnectAsync(
            remoteHost,
            serviceName,
            SocketProtectionLevel::PlainSocket)).then([this] (task<void> previousTask)
    {
        try
        {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.get();

            isSocketConnected = true;
            // Mark the socket as connected. We do not really care about the value of the property, but the mere 
            // existence of  it means that we are connected.
            CoreApplication::Properties->Insert("connected", nullptr);
        }
        catch (Exception^ ex)
        {
            hr = ex.HResult;
            errorStatus = SocketStatus::GetStatus(hr); 
            if (errorStatus != Unknown)
            {
                                                                switch (errorStatus) 
                   {
                    case HostNotFound:
                        // If the hostname is from the user, this may indicate a bad input.
                        // Set a flag to ask the user to re-enter the hostname.
                        isHostnameValid = false;
                        return;
                        break;
                    case ConnectionRefused:
                        // The server might be temporarily busy.
                        retrySocketConnect = true;
                        return;
                        break; 
                    case NetworkIsUnreachable: 
                        // This could be a connectivity issue.
                        retrySocketConnect = true;
                        break;
                    case UnreachableHost: 
                        // This could be a connectivity issue.
                        retrySocketConnect = true;
                        break;
                    case NetworkIsDown: 
                        // This could be a connectivity issue.
                        retrySocketConnect = true;
                        break;
                    // Handle other errors. 
                    default: 
                        // The connection failed and no options are available.
                        // Try to use cached data if it is available. 
                        // You may want to tell the user that the connect failed.
                        break;
                }
                }
                else 
                {
                    // Received an Hresult that is not mapped to an enum.
                    // This could be a connectivity issue.
                    retrySocketConnect = true;
                }
            }
        });
    }

Ausnahmen in „Windows.Web.Http“Exceptions in Windows.Web.Http

Der Konstruktor für die Windows::Foundation::Uri-Klasse in Verbindung mit Windows::Web::Http::HttpClient kann eine Ausnahme auslösen, wenn die übergebene Zeichenfolge kein gültiger URI ist (enthält Zeichen, die in einem URI nicht zulässig sind).The constructor for the Windows::Foundation::Uri class used with Windows::Web::Http::HttpClient can throw an exception if the string passed is not a valid URI (contains characters that are not allowed in a URI). In C++ gibt es keine Methode zum Analysieren einer Zeichenfolge für einen URI.In C++, there is no method to try and parse a string to a URI. Wenn eine APP Eingaben vom Benutzer für den Windows:: Foundation:: URIerhält, sollte sich der Konstruktor in einem try/catch-Block befinden.If an app gets input from the user for the Windows::Foundation::Uri, the constructor should be in a try/catch block. Wenn eine Ausnahme ausgelöst wird, kann die App den Benutzer benachrichtigen und einen neuen URI anfordern.If an exception is thrown, the app can notify the user and request a new URI.

Von der App sollte auch überprüft werden, ob das Schema im URI HTTP oder HTTPS lautet, da dies die einzigen von Windows::Web::Http::HttpClient unterstützten Schemas sind.Your app should also check that the scheme in the URI is HTTP or HTTPS since these are the only schemes supported by the Windows::Web::Http::HttpClient.

Hinzufügen von Code zum Überprüfen einer Zeichenfolge für einen URI vom BenutzerAdd code to validate a string for a URI from the user

    // Define some variables at the class level.
    Windows::Foundation::Uri^ resourceUri;

    bool isUriFromUser = false;
    bool isUriValid = false;

    ///...

    // If the value of 'inputUri' is set by the user in a control as input 
    // and is therefore untrusted input and could contain errors. 
    // If we can't create a valid hostname, we notify the user in statusText 
    // about the incorrect input.

    String ^uriString = inputUri;

    try 
    {
        isUriValid = false;
        resourceUri = ref new Windows::Foundation:Uri(uriString);

        if (resourceUri->SchemeName != "http" && resourceUri->SchemeName != "https")
        {
            statusText->Text = "Only 'http' and 'https' schemes supported. Please re-enter URI";
            return;
        }
        isUriValid = true;
    }
    catch (InvalidArgumentException ^ex)
    {
        statusText->Text = "You entered a bad URI, please re-enter Uri to continue.";
        return;
    }

    isUriFromUser = true;


    // ... Continue with code to execute with a valid URI.

Der Windows::Web::Http-Namespace bietet keine Funktion, die die Behandlung von Ausnahmen erleichtert.The Windows::Web::Http namespace lacks a convenience function. Eine APP, die HttpClient und andere Klassen in diesem Namespace verwendet, muss also den HRESULT -Wert verwenden.So, an app using HttpClient and other classes in this namespace needs to use the HRESULT value.

In Apps mit C++ stellt das Platform::Exception-Objekt einen Fehler während der App-Ausführung dar, wenn eine Ausnahme auftritt.In apps using C++, the Platform::Exception represents an error during app execution when an exception occurs. Die Platform::Exception::HResult-Eigenschaft gibt den HRESULT-Wert zurück, der der jeweiligen Ausnahme zugewiesen ist.The Platform::Exception::HResult property returns the HRESULT assigned to the specific exception. Die Platform::Exception::Message-Eigenschaft gibt die vom System bereitgestellte Zeichenfolge zurück, die dem HRESULT-Wert zugeordnet ist.The Platform::Exception::Message property returns the system-provided string that is associated with the HRESULT value. Mögliche HRESULT-Werte sind in der Headerdatei Winerror.h aufgeführt.Possible HRESULT values are listed in the Winerror.h header file. Eine App kann nach bestimmten HRESULT-Werten filtern, um das App-Verhalten je nach Ausnahmeursache zu ändern.An app can filter on specific HRESULT values to modify app behavior depending on the cause of the exception.

Bei den meisten Parameter Validierungs Fehlern lautet der zurückgegebene HRESULT E _ invalidArg.For most parameter validation errors, the HRESULT returned is E_INVALIDARG. Bei manchen unzulässigen Methodenaufrufen wird der HRESULT-Wert E_ILLEGAL_METHOD_CALL zurückgegeben.For some illegal method calls, the HRESULT returned is E_ILLEGAL_METHOD_CALL.

Hinzufügen von Code zum Behandeln von Ausnahmen beim Verwenden von HttpClient zum Herstellen einer Verbindung mit einem HTTP-ServerAdd code to handle exceptions when trying to use HttpClient to connect to an HTTP server

using namespace Windows::Foundation;
using namespace Windows::Web::Http;
    
    // Define some more variables at the class level.

    bool isHttpClientConnected = false
    bool retryHttpClient = false;

    // The number of times we have tried to connect the socket
    unsigned int retryConnectCount = 0;

    // The maximum number of times to retry a connect operation.
    unsigned int maxRetryConnectCount = 5; 
    ///...

    // We pass in a valid resourceUri parameter.
    // The URI must contain a scheme and a name or an IP address.

    HttpClient ^ httpClient = ref new HttpClient();
    HResult hr;

    // Save the httpClient, so any subsequent steps can use it.
    CoreApplication::Properties->Insert("httpClient", httpClient);

    // Send a GET request to the HTTP server. 
    create_task(httpClient->GetAsync(resourceUri)).then([this] (task<void> previousTask)
    {
        try
        {
            // Try getting all exceptions from the continuation chain above this point.
            previousTask.get();

            isHttpClientConnected = true;
            // Mark the HttClient as connected. We do not really care about the value of the property, but the mere 
            // existence of  it means that we are connected.
            CoreApplication::Properties->Insert("connected", nullptr);
        }
        catch (Exception^ ex)
        {
            hr = ex.HResult;
                                                switch (errorStatus) 
               {
                case WININET_E_NAME_NOT_RESOLVED:
                    // If the Uri is from the user, this may indicate a bad input.
                    // Set a flag to ask user to re-enter the Uri.
                    isUriValid = false;
                    return;
                    break;
                case WININET_E_CANNOT_CONNECT:
                    // The server might be temporarily busy.
                    retryHttpClientConnect = true;
                    return;
                    break; 
                case WININET_E_CONNECTION_ABORTED: 
                    // This could be a connectivity issue.
                    retryHttpClientConnect = true;
                    break;
                case WININET_E_CONNECTION_RESET: 
                    // This could be a connectivity issue.
                    retryHttpClientConnect = true;
                    break;
                case INET_E_RESOURCE_NOT_FOUND: 
                    // The server cannot locate the resource specified in the uri.
                    // If the Uri is from user, this may indicate a bad input.
                    // Set a flag to ask the user to re-enter the Uri
                    isUriValid = false;
                    return;
                    break;
                // Handle other errors. 
                default: 
                    // The connection failed and no options are available.
                    // Try to use cached data if it is available. 
                    // You may want to tell the user that the connect failed.
                    break;
            }
            else 
            {
                // Received an Hresult that is not mapped to an enum.
                // This could be a connectivity issue.
                retrySocketConnect = true;
            }
        }
    });

Weitere RessourcenOther resources

VerweisReference

Beispiel-AppsSample apps