Mise en réseau pour les jeuxNetworking for games

Apprenez à développer et à incorporer des fonctionnalités réseau dans votre jeu DirectX.Learn how to develop and incorporate networking features into your DirectX game.

Concepts en un clin d’œilConcepts at a glance

Vous pouvez utiliser un large éventail de fonctionnalités réseau dans votre jeu DirectX, qu’il s’agisse d’un simple jeu autonome ou de jeux multijoueurs de large portée.A variety of networking features can be used in your DirectX game, whether it is a simple standalone game to massively multi-player games. L’utilisation du réseau la plus simple consiste à stocker des noms d’utilisateur et des scores de jeu sur un serveur réseau central.The simplest use of networking would be to store user names and game scores on a central network server.

Les API de réseau sont nécessaires dans les jeux multijoueurs qui ont recours au modèle d’infrastructure (client-serveur ou pair à pair Internet) tout comme dans les jeux ad hoc (pair à pair local).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. Pour les jeux multijoueurs sur serveur, un serveur de jeux centralisé gère en règle générale toutes les opérations de jeu et l’application de jeu cliente est utilisée pour la saisie, l’affichage des éléments graphiques, la lecture audio et d’autres fonctionnalités.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. La vitesse et la latence des transferts réseau sont des aspects indispensables à la garantie d’une expérience de jeu satisfaisante.The speed and latency of network transfers is a concern for a satisfactory game experience.

Dans le cas de jeux pair à pair, chaque application de joueur gère les entrées et les graphiques.For peer-to-peer games, each player's app handles the input and graphics. Dans la plupart des cas, les joueurs se trouvent proches l’un de l’autre. La latence réseau s’en trouve réduite mais peut néanmoins poser des problèmes.In most cases, the game players are located in close proximity so that network latency should be lower but is still a concern. La découverte d‘homologues et l’établissement d’une connexion peuvent alors devenir une source de préoccupation.How to discovery peers and establish a connection becomes a concern.

Dans les jeux pour joueur unique, un service ou serveur Web central est souvent utilisé pour stocker les noms d’utilisateurs, les scores de jeu et d’autres informations diverses.For single-player games, a central Web server or service is often used to store user names, game scores, and other miscellaneous information. Dans ces jeux, la vitesse et la latence des transferts réseau sont moins préoccupantes car elles ne gênent pas directement le jeu.In these games, the speed and latency of networking transfers is less of a concern since it doesn't directly affect game operation.

Les conditions du réseau peuvent changer à tout moment. Un jeu qui utilise les API de réseau doit pouvoir gérer les exceptions réseau qui sont susceptibles de se produire.Network conditions can change at any time, so any game that uses networking APIs needs to handle network exceptions that may occur. Pour plus d’informations sur la gestion des exceptions réseau, voir Notions de base en matière de réseau.To learn more about handling network exceptions, see Networking basics.

Les pare-feu et les proxys web sont courants et peuvent limiter l’utilisation des fonctionnalités réseau.Firewalls and web proxies are common and can affect the ability to use networking features. Un jeu qui utilise le réseau doit être préparé pour gérer convenablement les pare-feux et les proxys.A game that uses networking needs to be prepared to properly handle firewalls and proxies.

Dans le cas des appareils mobiles, il est important de surveiller les ressources réseau disponibles et utiliser au mieux les connexions réseau limitées. En effet, les frais d’itinérance ou de données peuvent être non négligeables.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.

L’isolement réseau fait partie du modèle de sécurité des applications utilisé par Windows.Network isolation is part of the app security model used by Windows. Windows détecte activement les limites du réseau et applique les restrictions d’accès pour l’isolement réseau.Windows actively discovers network boundaries and enforces network access restrictions for network isolation. Les applications doivent déclarer les fonctionnalités d’isolement réseau afin de définir l’étendue de l’accès au réseau.Apps must declare network isolation capabilities in order to define the scope of network access. Sans déclarer ces fonctionnalités, votre application ne peut pas avoir accès aux ressources réseau.Without declaring these capabilities, your app will not have access to network resources. Pour plus d’informations sur la façon dont Windows applique l’isolement réseau pour les applications, voir Comment configurer les fonctionnalités d’isolement réseau.To learn more about how Windows enforces network isolation for apps, see How to configure network isolation capabilities.

Remarques relatives à la conceptionDesign considerations

Vous pouvez utiliser un éventail d’API de réseau dans les jeux DirectX.A variety of networking APIs can be used in DirectX games. Il est donc important de choisir la bonne API.So, it is important to pick the right API. Windows prend en charge une grande variété d’API de réseau que votre application peut utiliser pour communiquer avec d’autres ordinateurs et appareils sur Internet ou sur des réseaux privés.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. Vous devez donc commencer par déterminer les fonctionnalités réseau dont votre application a besoin.Your first step is to figure out what networking features your app needs.

Il s’agit des API réseau les plus populaires pour les jeux.These are the more popular network APIs for games.

  • TCP et sockets : fournit une connexion fiable.TCP and sockets - Provides a reliable connection. Utilisez TCP pour les jeux qui ne nécessitent aucune sécurité.Use TCP for game operations that don’t need security. TCP permet au serveur d’effectuer facilement une montée en puissance. Il est ainsi couramment utilisé dans les jeux qui ont recours au modèle d’infrastructure (client-serveur ou pair à pair Internet).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 peut également servir pour les jeux ad hoc (pair à pair local) via Wi-Fi Direct et Bluetooth.TCP can also be used by ad hoc (local peer-to-peer) games over Wi-Fi Direct and Bluetooth. TCP est couramment utilisé pour les déplacements d’objets, l’interaction entre les personnages, la conversation textuelle et bien d’autres opérations.TCP is commonly used for game object movement, character interaction, text chat, and other operations. La classe StreamSocket fournit un socket TCP qui peut être utilisé dans Microsoft Store jeux.The StreamSocket class provides a TCP socket that can be used in Microsoft Store games. La classe StreamSocket est utilisée avec les classes associées de l’espace de noms Windows::Networking::Sockets.The StreamSocket class is used with related classes in the Windows::Networking::Sockets namespace.
  • TCP et sockets avec SSL : offre une connexion fiable qui empêche l’écoute clandestine.TCP and sockets using SSL - Provides a reliable connection that prevents eavesdropping. Utilisez les connexions TCP avec SSL pour les jeux qui nécessitent de la sécurité.Use TCP connections with SSL for game operations that need security. Le chiffrement et le traitement de SSL ajoute un coût en termes de latence et de performance. Il est donc uniquement utilisé quand la sécurité est nécessaire.The encryption and overhead of SSL adds a cost in latency and performance, so it is only used when security is needed. TCP avec SSL est couramment utilisé pour les connexions, les ressources d’achat et de commerce, la création de personnages de jeu et la gestion.TCP with SSL is commonly used for login, purchasing and trading assets, game character creation and management. La classe StreamSocket fournit un socket TCP prenant en charge SSL.The StreamSocket class provides a TCP socket that supports SSL.
  • UDP et sockets : offre des transferts réseau non fiables avec un traitement faible.UDP and sockets - Provides unreliable network transfers with low overhead. UDP est utilisé pour les jeux qui tolèrent un faible niveau de latence et quelques pertes de paquets.UDP is used for game operations that require low latency and can tolerate some packet loss. Il sert souvent dans les jeux de combat, pour les tirs et les trajectoires, l’audio sur le réseau et la conversation vocale.This is often used for fighting games, shooting and tracers, network audio, and voice chat. La classe DatagramSocket fournit un socket UDP qui peut être utilisé dans Microsoft Store jeux.The DatagramSocket class provides a UDP socket that can be used in Microsoft Store games. La classe DatagramSocket est utilisée avec les classes associées de l’espace de noms Windows::Networking::Sockets.The DatagramSocket class is used with related classes in the Windows::Networking::Sockets namespace.
  • Client HTTP : offre une connexion fiable aux serveurs HTTP.HTTP Client - Provides a reliable connection to HTTP servers. Le scénario de réseau le plus courant consiste à accéder à un site Web pour récupérer ou stocker des informations.The most common networking scenario is to access a web site to retrieve or store information. Il peut s’agir tout simplement d’un site Web permettant de stocker des informations utilisateur et des scores de jeu.A simple example would be a game that uses a website to store user information and game scores. Combiné à SSL à des fins de sécurité, un client HTTP peut être utilisé pour la connexion, l’achat, les ressources de commerce, la création de personnages de jeu et la gestion.When used with SSL for security, an HTTP client can be used for login, purchasing, trading assets, game character creation, and management. La classe httpclient fournit une API client http moderne à utiliser dans Microsoft Store jeux.The HttpClient class provides a modern HTTP client API for use in Microsoft Store games. La classe HttpClient est utilisée avec les classes associées de l’espace de noms Windows::Web::Http.The HttpClient class is used with related classes in the Windows::Web::Http namespace.

Gestion des exceptions réseau dans votre jeu DirectXHandling network exceptions in your DirectX game

Quand une exception réseau survient dans votre jeu DirectX, cela peut être le signe d’un problème existant ou d’une défaillance sérieuse.When a network exception occurs in your DirectX game, this indicates a significant problem or failure. Des exceptions peuvent survenir pour de multiples raisons lorsque vous utilisez les API de réseau.Exceptions can occur for many reasons when using networking APIs. Bien souvent, l’exception peut être due à des changements de connectivité réseau ou d’autres problèmes réseau liés à l’hôte ou au serveur distant.Often, the exception can result from changes in network connectivity or other networking issues with the remote host or server.

Certaines exceptions provenant de l’utilisation d’API de réseau peuvent avoir les causes suivantes :Some causes of exceptions when using networking APIs include the following:

  • entrée utilisateur d’un nom d’hôte ou d’un URI contenant des erreurs ou non valide ;Input from the user for a hostname or a URI contains errors and is not valid.
  • échecs de résolution de noms lors de la recherche d’un nom d’hôte ou d’un URI ;Name resolutions failures when looking up a hostname or a URi.
  • perte ou modification de la connectivité réseau ;Loss or change in network connectivity.
  • échecs de connexion réseau lors de l’utilisation de sockets ou d’API clientes HTTP ;Network connection failures using sockets or the HTTP client APIs.
  • erreurs de serveur réseau ou de point de terminaison distant ;Network server or remote endpoint errors.
  • erreurs réseau diverses.Miscellaneous networking errors.

Les exceptions liées à des erreurs réseau (perte ou modification de connectivité, échecs de connexion et défaillances de serveur, par exemple) peuvent se produire à tout moment.Exceptions from network errors (for example, loss or change of connectivity, connection failures, and server failures) can happen at any time. Ces erreurs donnent lieu à la levée d’exceptions.These errors result in exceptions being thrown. Si votre application ne gère pas une exception, le runtime peut arrêter entièrement votre application.If an exception is not handled by your app, it can cause your entire app to be terminated by the runtime.

Vous devez écrire du code capable de gérer les exceptions au moment où vous appelez la plupart des méthodes réseau asynchrones.You must write code to handle exceptions when you call most asynchronous network methods. Parfois, quand une exception se produit, vous pouvez essayer de résoudre le problème en appliquant de nouveau une méthode réseau.Sometimes, when an exception occurs, a network method can be retried as a way to resolve the problem. Dans d’autres cas, votre application doit pouvoir poursuivre sans connectivité réseau en utilisant les données préalablement mises en cache.Other times, your app may need to plan to continue without network connectivity using previously cached data.

Les applications de plateforme Windows universelle (UWP) lèvent généralement une seule exception.Universal Windows Platform (UWP) apps generally throw a single exception. Votre gestionnaire d’exceptions peut récupérer des informations plus détaillées sur la cause de l’exception afin d’analyser la défaillance et de prendre des décisions appropriées.Your exception handler can retrieve more detailed information about the cause of the exception to better understand the failure and make appropriate decisions.

Lorsqu’une exception survient dans un jeu DirectX qui correspond à une application UWP, il est possible de récupérer la valeur HRESULT permettant d’identifier la cause de l’erreur.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. Le fichier include Winerror.h contient une liste importante de valeurs HRESULT possibles qui inclut les erreurs réseau.The Winerror.h include file contains a large list of possible HRESULT values that includes network errors.

Les API de réseau prennent en charge différentes méthodes permettant de récupérer ces informations détaillées sur la cause d’une exception :The networking APIs support different methods for retrieving this detailed information about the cause of an exception.

  • Méthode permettant d’extraire la valeur HRESULT de l’erreur à l’origine de l’exception.A method to retrieve the HRESULT value of the error that caused the exception. La liste des valeurs HRESULT potentielles est importante et non spécifiée.The possible list of potential HRESULT values is large and unspecified. La valeur HRESULT peut être extraite lors de l’utilisation d’une API de réseau quelconque.The HRESULT value can be retrieved when using any of the networking APIs.
  • Méthode d’assistance qui convertit la valeur HRESULT en valeur d’énumération.A helper method that converts the HRESULT value to an enumeration value. La liste des valeurs d’énumération potentielles est précisée et relativement petite.The list of possible enumeration values is specified and relatively small. Une méthode d’assistance est disponible pour les classes de sockets dans Windows :: Networking :: Sockets.A helper method is available for the socket classes in the Windows::Networking::Sockets.

Exceptions dans Windows.Networking.SocketsExceptions in Windows.Networking.Sockets

Le constructeur de la classe hostname utilisée avec les sockets peut lever une exception si la chaîne transmise n’est pas un nom d’hôte valide (contient des caractères qui ne sont pas autorisés dans un nom d’hôte).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). Si une application obtient une entrée utilisateur pour le HostName d’une connexion homologue de jeu, le constructeur doit se trouver dans un bloc try/catch.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. Si une exception est levée, l’application peut notifier l’utilisateur et demander un nouveau nom d’hôte.If an exception is thrown, the app can notify the user and request a new hostname.

Ajouter du code pour valider une chaîne de nom d’hôte de l’utilisateurAdd 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.

L’espace de noms Windows.Networking.Sockets propose des méthodes et des énumérations d’assistance pratiques qui permettent de gérer les erreurs quand des sockets sont utilisés.The Windows.Networking.Sockets namespace has convenient helper methods and enumerations for handling errors when using sockets. Ceci peut s’avérer utile pour gérer différemment certaines exceptions réseau dans votre application.This can be useful for handling specific network exceptions differently in your app.

Une erreur rencontrée durant une opération DatagramSocket, StreamSocket ou StreamSocketListener entraîne la levée d’une exception.An error encountered on DatagramSocket, StreamSocket, or StreamSocketListener operation results in an exception being thrown. La cause de l’exception est une valeur d’erreur représentée en tant que valeur HRESULT.The cause of the exception is an error value represented as an HRESULT value. La méthode SocketError. GetStatus est utilisée pour convertir une erreur réseau d’une opération de socket en valeur d’énumération SocketErrorStatus .The SocketError.GetStatus method is used to convert a network error from a socket operation to a SocketErrorStatus enumeration value. La plupart des valeurs d’énumération SocketErrorStatus correspondent à une erreur renvoyée par l’opération de socket Windows native.Most of the SocketErrorStatus enumeration values correspond to an error returned by the native Windows sockets operation. Une application peut filtrer des valeurs d’énumération SocketErrorStatus spécifiques pour modifier son comportement en fonction de la cause de l’exception.An app can filter on specific SocketErrorStatus enumeration values to modify app behavior depending on the cause of the exception.

Pour les erreurs de validation de paramètre, une application peut également utiliser la valeur HRESULT de l’exception pour obtenir des informations plus détaillées sur l’erreur à l’origine de l’exception.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. Les valeurs HRESULT possibles sont répertoriées dans le fichier d’en-tête Winerror.h.Possible HRESULT values are listed in the Winerror.h header file. Pour la plupart des erreurs de validation de paramètre, le HRESULT retourné est E _ INVALIDARG.For most parameter validation errors, the HRESULT returned is E_INVALIDARG.

Ajouter du code pour gérer les exceptions quand vous essayez d’établir une connexion de socket de fluxAdd 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;
                }
            }
        });
    }

Exceptions dans Windows.Web.HttpExceptions in Windows.Web.Http

Le constructeur de la classe Windows :: Foundation :: URI utilisée avec Windows :: Web :: http :: httpclient peut lever une exception si la chaîne passée n’est pas un URI valide (contient des caractères qui ne sont pas autorisés dans un URI).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). En C++, aucune méthode ne permet d’essayer et d’analyser une chaîne passée à un URI.In C++, there is no method to try and parse a string to a URI. Si une application obtient l’entrée de l’utilisateur pour Windows :: Foundation :: URI, le constructeur doit être dans un bloc try/catch.If an app gets input from the user for the Windows::Foundation::Uri, the constructor should be in a try/catch block. Si une exception est levée, l’application peut informer l’utilisateur et demander un nouvel URI.If an exception is thrown, the app can notify the user and request a new URI.

Votre application doit également vérifier si le schéma de l’URI est HTTP ou HTTPS, dans la mesure où il s’agit des seuls schémas pris en charge par Windows::Web::Http::HttpClient.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.

Ajouter du code pour valider une chaîne d’URI de l’utilisateurAdd 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.

L’espace de noms Windows::Web::Http est dépourvu d’une fonction pratique.The Windows::Web::Http namespace lacks a convenience function. Ainsi, une application qui utilise httpclient et d’autres classes de cet espace de noms doit utiliser la valeur HRESULT .So, an app using HttpClient and other classes in this namespace needs to use the HRESULT value.

Quand une exception se produit dans une application en C++ et que cette application est en cours d’exécution, Platform::Exception représente une erreur.In apps using C++, the Platform::Exception represents an error during app execution when an exception occurs. La propriété Platform::Exception::HResult renvoie la valeur HRESULT affectée à l’exception spécifique.The Platform::Exception::HResult property returns the HRESULT assigned to the specific exception. La propriété Platform::Exception::Message renvoie la chaîne fournie par le système associée à la valeur HRESULT.The Platform::Exception::Message property returns the system-provided string that is associated with the HRESULT value. Les valeurs HRESULT possibles sont répertoriées dans le fichier d’en-tête Winerror.h.Possible HRESULT values are listed in the Winerror.h header file. Une application peut filtrer sur des valeurs HRESULT spécifiques pour modifier son comportement en fonction de la cause de l’exception.An app can filter on specific HRESULT values to modify app behavior depending on the cause of the exception.

Pour la plupart des erreurs de validation de paramètre, le HRESULT retourné est E _ INVALIDARG.For most parameter validation errors, the HRESULT returned is E_INVALIDARG. Pour certains appels de méthodes non conformes, la valeur HRESULT renvoyée est E_ILLEGAL_METHOD_CALL.For some illegal method calls, the HRESULT returned is E_ILLEGAL_METHOD_CALL.

Ajouter du code pour gérer les exceptions lors de la tentative d’utilisation de httpclient pour la connexion à un serveur httpAdd 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;
            }
        }
    });

Autres ressourcesOther resources

Informations de référenceReference

Exemples d’applicationsSample apps