Ormai sono lanciato nella realizzazione di classi di supporto per la gestione della rete. Dopo NetworkChange2, oggi è la volta di una classe che consente di sapere se il PC è collegato a Internet oppure no, nonché di ricevere notifiche se lo stato della connessione cambia:
1 using System;
2 using System.ComponentModel;
3 using System.Threading;
4 using System.Net;
5
6 namespace System.Net.NetworkInformation
7 {
8 public delegate void InternetAvailabilityChangedEventHandler(object sender, InternetAvailabilityEventArgs e);
9
10 public static class NetworkMonitor
11 {
12 private const string HOST = "http://www.microsoft.com";
13
14 private static AsyncOperation operation;
15 private static SendOrPostCallback internetAvailabilityCallback;
16 private static bool internetAvailable;
17
18 private static Timer checkConnection;
19 private const int CHECK_CONNECTION_TIMEOUT = 5000;
20
21 public static event InternetAvailabilityChangedEventHandler InternetAvailabilityChanged;
22
23 static NetworkMonitor()
24 {
25 internetAvailable = false;
26
27 operation = AsyncOperationManager.CreateOperation(null);
28 internetAvailabilityCallback = new SendOrPostCallback(InternetAvailabilityHandler);
29
30 //Attiva il timer che controlla la disponibilità della connessione.
31 checkConnection = new Timer(new TimerCallback(IsConnectionAvailable), null, 1, CHECK_CONNECTION_TIMEOUT);
32 }
33
34 public static bool IsConnectionAvailable()
35 {
36 HttpWebRequest request = null;
37 HttpWebResponse response = null;
38 bool isAvailable = false;
39
40 try
41 {
42 request = (HttpWebRequest)HttpWebRequest.Create(HOST);
43 response = (HttpWebResponse)request.GetResponse();
44
45 if (response.StatusCode == HttpStatusCode.OK)
46 {
47 // HTTP = 200 - Internet connection available, server online
48 isAvailable = true;
49 }
50 }
51 catch (WebException)
52 { }
53 finally
54 {
55 try
56 {
57 if (response != null)
58 response.Close();
59 }
60 catch { }
61 }
62
63 return isAvailable;
64 }
65
66 private static void IsConnectionAvailable(object stateInfo)
67 {
68 checkConnection.Change(Timeout.Infinite, Timeout.Infinite);
69
70 bool isAvailable = IsConnectionAvailable();
71 if (isAvailable != internetAvailable)
72 {
73 internetAvailable = isAvailable;
74 operation.Post(internetAvailabilityCallback, new InternetAvailabilityEventArgs(isAvailable));
75 }
76
77 checkConnection.Change(CHECK_CONNECTION_TIMEOUT, CHECK_CONNECTION_TIMEOUT);
78 }
79
80 private static void InternetAvailabilityHandler(object stateInfo)
81 {
82 if (InternetAvailabilityChanged != null)
83 InternetAvailabilityChanged(null, (InternetAvailabilityEventArgs)stateInfo);
84 }
85 }
86
87 public class InternetAvailabilityEventArgs : EventArgs
88 {
89 private bool isAvailable;
90 public bool IsAvailable
91 {
92 get { return isAvailable; }
93 }
94
95 public InternetAvailabilityEventArgs(bool isAvailable)
96 {
97 this.isAvailable = isAvailable;
98 }
99 }
100 }
In estrema sintesi, questa classe cerca di effettuare una richiesta HTTP (righe 42-43) e, in base al messaggio di risposta, determina se la connessione al Web è disponibile oppure no. Questo non è l'unico metodo possibile, ad esempio un'alternativa si basa sull'utilizzo dell'API di Windows InternetGetConnectedState, ma dove possibile preferisco rimanere nel "mondo managed".
Technorati Tag:
.NET,
Programming,
CS