27 votes

Comment détecter une connexion Internet active en C# ?

J'ai un code C# qui, en gros, télécharge un fichier via le protocole FTP (à l'aide de FtpWebRequest ). Cependant, j'aimerais d'abord déterminer si la connexion Internet fonctionne avant d'essayer de télécharger le fichier (car s'il n'y en a pas, il est inutile d'essayer, le logiciel devrait simplement se mettre en veille pendant un certain temps et vérifier à nouveau).

Existe-t-il un moyen simple de le faire ou dois-je simplement essayer de télécharger le fichier et, en cas d'échec, réessayer, en supposant que la connexion réseau était interrompue ?

30voto

Zyo Points 706

Utilisez simplement la fonction simple

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

qui renvoient vrai ou faux si la connexion est établie.

De MSDN : Une connexion réseau est considérée comme disponible si une interface réseau est marquée "up" et n'est pas une interface de bouclage ou de tunnel.

Gardez à l'esprit que la connectivité n'est pas tout, vous pouvez être connecté à un réseau local et le routeur n'est pas connecté à l'Internet par exemple. Pour savoir si vous êtes vraiment connecté à l'internet, essayez le test suivant Ping classe.

14voto

Andy Shellam Points 8120

Il existe un événement "disponibilité du réseau modifiée" qui se déclenche lorsque l'état "up" d'une connexion réseau change sur une interface qui n'est pas un tunnel ou une boucle.

Vous pourriez lire l'état de tous les adaptateurs réseau du système au démarrage, stocker la valeur actuelle de "le réseau est disponible", puis écouter cet événement et modifier votre variable d'état du réseau lorsque cet événement se déclenche. Il semble également qu'elle puisse gérer les connexions dial-up et ISDN.

Il est vrai qu'il y a d'autres facteurs à prendre en compte, comme le fait que la carte réseau est connectée à un routeur (et qu'elle fonctionne) mais que la connexion Internet sur le routeur est en panne, ou que l'hôte distant ne répond pas, mais cela vous évitera au moins d'essayer d'établir une connexion qui ne fonctionnera pas s'il n'y a pas de connexion réseau pour commencer (par exemple, une liaison VPN ou RNIS est en panne).

Il s'agit d'une application console C# - lancez-la, puis désactivez ou débranchez votre connexion réseau :-)

class Program
{
    static bool networkIsAvailable = false;

    static void Main(string[] args)
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface nic in nics)
        {
            if (
                (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) &&
                nic.OperationalStatus == OperationalStatus.Up)
            {
                networkIsAvailable = true;
            }
        }

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);

        NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);

        Console.ReadLine();
    }

    static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        networkIsAvailable = e.IsAvailable;

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);
    }
}

11voto

JaredPar Points 333733

Je pense que le meilleur approximation que vous pouvez utiliser est de vérifier le OperationalStatus sur le NetworkInterface type.

using System.Net.NetworkInformation;

public bool IsNetworkLikelyAvailable() {
  return NetworkInterface
    .GetAllNetworkInterfaces()
    .Any(x => x.OperationalStatus == OperationalStatus.Up);
}

N'oubliez pas qu'il s'agit d'une approximation. Au moment où cette méthode revient, l'ordinateur peut perdre ou gagner sa connexion internet. IMO, j'irais directement vers le téléchargement et je gérerais l'erreur puisque vous ne pouvez pas prouver que cela n'arrivera pas.

6voto

Dean K. Points 5298

Ne pouvez-vous pas simplement utiliser le Classe Ping de la Espace de nom System.Net.NetworkInformation d'envoyer un ping au serveur FTP avant d'essayer de télécharger le fichier ?

5voto

Damien_The_Unbeliever Points 102139

Pensez à la situation où votre vérification revient et dit "la connexion est là", et avant que vous puissiez commencer votre FTP, la connexion tombe.

Ou lorsque la connexion s'interrompt au milieu de votre demande FTP.

Étant donné que vous devez coder pour ces situations de toute façon , il suffit de sauter le contrôle

Modifier en réponse aux commentaires de Jason

La condition inverse peut également se produire : lorsque vous vérifiez l'existence d'une connexion, il n'y en a pas, mais un instant plus tard, la connexion est établie. Que faites-vous maintenant ? Commencez-vous à harceler l'utilisateur sur l'absence de connexion, même si elle est maintenant disponible ?

En fin de compte, vous avez affaire à un grand nombre de ressources (votre connexion Internet, les routeurs intermédiaires, l'hôte, son service FTP). Tous ces éléments sont sujets à des changements indépendants de votre volonté (comme l'indique le commentaire de Seth), et aucun test préalable ne pourra répondre à la question "serai-je en mesure d'effectuer ce téléchargement" ?

Comme le PO a indiqué qu'il envisageait une approche du type "reculez et réessayez plus tard", je pense qu'il est approprié de faire tout cela en arrière-plan et de ne pas ennuyer l'utilisateur du tout - à moins que vous n'ayez essayé pendant une durée "déraisonnable" sans succès.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X