Comment faire pour
vérifier s'il est connecté à l'Internet en C #
Il ya plusieurs façons de vérifier si la connexion Internet
est disponible en C #. Étrangement, la solution la plus optimale qui a
fonctionné pour moi était celui que je m'y attendais le moins. Permettez-moi de
vous présenter les trois principales approches et décrire les avantages et les
inconvénients de chacun d'eux. Vous pouvez ensuite tirer vos propres
conclusions quant à ce qui fonctionne le mieux pour votre tâche.
#1 –
GetIsNetworkAvailable
La première solution est aussi la
plus simple de tous. Il suffit d'appeler la fonction GetIsNetworkAvailable et
la valeur booléenne vous dira si
l'ordinateur est connecté à un réseau. Et là réside le problème! Il reviendra
vrai même si vous êtes connecté qu'à un réseau domestique et la connexion
internet réelle est en panne. Il revient aussi vrai lorsque vous avez VMware ou
autre logiciel de visualisation installé en raison des connexions réseau
associées à VMware sont toujours.
using System.Net.NetworkInformation;
public static bool NetStatus()
{
return NetworkInterface.GetIsNetworkAvailable();
}
#2 – NetworkAvailabilityChangedEventHandler
La deuxième solution fait usage de
l'espace de noms System.Net.NetworkInformation
qui donne accès aux données du réseau de trafic, des informations
d'adresse réseau, et la notification des changements d'adresse pour
l'ordinateur local. Le framework. NET nous informer via un rappel lorsqu'un
réseau des changements de disponibilité. Bien que cette méthode est mieux que
contrôler en permanence l'état en appelant la méthode GetIsNetworkAvailable, il souffre toujours des
mêmes inconvénients. Il ne retourne false lorsque toutes les connexions réseau
descendent et qui est un problème majeur pour les utilisateurs du logiciel de
visualisation tels que VMware et des ordinateurs connectés à plusieurs réseaux,
car le gestionnaire d'événement ne fournit aucune information quant au statut
de la connexion réseau a changé.
using System.Net.NetworkInformation;
private void Form_Load(object sender, EventArgs e)
{
NetworkChange.NetworkAvailabilityChanged
+= new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
}
private void NetworkChange_NetworkAvailabilityChanged(object sender,
NetworkAvailabilityEventArgs e)
{
if (e.IsAvailable)
{
MessageBox.Show("Available");
}
else
{
MessageBox.Show("Not
available");
}
}
#3 –
NetworkAvailabilityChangedEventHandler
La troisième approche est la plus
compliquée, mais vous obtenez une image complète de ce qui se passe avec les
connexions réseau sur l'ordinateur. La principale fonctionnalité est fournie
par la fonction GetAllNetworkInterfaces
qui retourne exactement ce que son nom l'indique - un tableau de toutes
les interfaces réseau. C'est à vous de les trier et de trouver l'information
que vous cherchez. Le seul inconvénient de cette méthode est qu'elle semble
utiliser un peu de bande passante de l'UC (environ 8% en moyenne, ce qui est
beaucoup compte tenu que la minuterie est réglée à 500 ms). L'augmentation de
l'utilisation du processeur était aussi la principale raison pour laquelle j'ai
décidé de ne pas utiliser cette approche.
using System;
using System.Net.NetworkInformation;
using Timer=System.Threading.Timer;
namespace NetworkCheckApp
{
public class NetworkStatusObserver
{
public event EventHandler<EventArgs>
NetworkChanged;
private NetworkInterface[]
oldInterfaces;
private Timer timer;
public void Start()
{
timer
= new Timer(UpdateNetworkStatus, null, new TimeSpan(0, 0, 0, 0, 500), new TimeSpan(0, 0, 0, 0,
500));
oldInterfaces
= NetworkInterface.GetAllNetworkInterfaces();
}
private void UpdateNetworkStatus(object o)
{
var
newInterfaces = NetworkInterface.GetAllNetworkInterfaces();
bool hasChanges = false;
if (newInterfaces.Length !=
oldInterfaces.Length)
{
hasChanges
= true;
}
if (!hasChanges)
{
for (int i = 0; i <
oldInterfaces.Length; i++)
{
if (oldInterfaces[i].Name
!= newInterfaces[i].Name || oldInterfaces[i].OperationalStatus !=
newInterfaces[i].OperationalStatus)
{
hasChanges
= true;
break;
}
}
}
oldInterfaces
= newInterfaces;
if (hasChanges)
{
RaiseNetworkChanged();
}
}
private void RaiseNetworkChanged()
{
if (NetworkChanged != null)
{
NetworkChanged.Invoke(this,
null);
}
}
}
}
#4 – GetHostAddresses
La quatrième et dernière solution,
que j'ai effectivement utilisé dans un de mes projets est basé sur Dns.GetHostAddresses
() appel de fonction. L'appel est très rapide et je n'ai pas été en mesure de
détecter toute utilisation de l'UC significative quand il a été utilisé sur une
minuterie avec un intervalle de 500ms.
Quelqu'un peut faire valoir que, en
utilisant un site Web existant, nous nous exposons à une situation où le site
peut être en panne et nos diagnostics de connexion internet sera faux. Mais
vraiment, quelles sont les chances de Google étant bas toute quantité
importante de temps au cours des 10 prochaines années?
try
{
string myAddress =
"www.google.com";
IPAddress[]
addresslist = Dns.GetHostAddresses(myAddress);
if (addresslist[0].ToString().Length
> 6)
{
if (!ConnectionOnline)
{
ConnectionOnline
= true;
}
}
else
if (ConnectionOnline)
{
ConnectionOnline
= false;
}
}
catch
{
groupe {
ConnectionOnline
= false;
}
}