¿Cuál es la mejor manera de comprobar la conectividad a Internet utilizando .NET?
¿Cuál es la forma más rápida y eficaz de comprobar la conectividad a Internet en .NET?
Podrías usar este código, que también debería funcionar en Irán y China.
public static bool CheckForInternetConnection(int timeoutMs = 10000, string url = null)
{
try
{
url ??= CultureInfo.InstalledUICulture switch
{
{ Name: var n } when n.StartsWith("fa") => // Iran
"http://www.aparat.com",
{ Name: var n } when n.StartsWith("zh") => // China
"http://www.baidu.com",
_ =>
"http://www.gstatic.com/generate_204",
};
var request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.Timeout = timeoutMs;
using (var response = (HttpWebResponse)request.GetResponse())
return true;
}
catch
{
return false;
}
}
No hay absolutamente ninguna manera de que puedas verificar de manera confiable si hay una conexión a Internet o no (supongo que te refieres al acceso a Internet).
Sin embargo, puedes solicitar recursos que prácticamente nunca están fuera de línea, como hacer ping a google.com o algo similar. Creo que esto sería eficiente.
try {
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
return (reply.Status == IPStatus.Success);
}
catch (Exception) {
return false;
}
En lugar de verificar, simplemente realice la acción (solicitud web, correo, ftp, etc.) y prepárese para que la solicitud falle, lo cual debe hacer de todos modos, incluso si la verificación fue exitosa.
Considera lo siguiente:
1 - check, and it is OK
2 - start to perform action
3 - network goes down
4 - action fails
5 - lot of good your check did
Si la red no funciona, su acción fallará tan rápidamente como un ping, etc.
1 - start to perform action
2 - if the net is down(or goes down) the action will fail
NetworkInterface.GetIsNetworkAvailable
es muy poco confiable. Simplemente tenga alguna conexión VMware u otra LAN y arrojará un resultado incorrecto. También sobre Dns.GetHostEntry
el método, solo me preocupaba si la URL de prueba podría estar bloqueada en el entorno donde se implementará mi aplicación.
Otra forma que descubrí es usando InternetGetConnectedState
el método. mi codigo es
[System.Runtime.InteropServices.DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
public static bool CheckNet()
{
int desc;
return InternetGetConnectedState(out desc, 0);
}
Una prueba de conexión a Internet haciendo ping a Google:
new Ping().Send("www.google.com.mx").Status == IPStatus.Success