¿Cuál es la mejor manera de comprobar la conectividad a Internet utilizando .NET?

Resuelto Mohit Deshpande asked hace 14 años • 28 respuestas

¿Cuál es la forma más rápida y eficaz de comprobar la conectividad a Internet en .NET?

Mohit Deshpande avatar Jan 09 '10 07:01 Mohit Deshpande
Aceptado

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;
    }
}
ChaosPandion avatar Jan 09 '2010 00:01 ChaosPandion

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;
}
Leo avatar Jan 09 '2010 00:01 Leo

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
dbasnett avatar Jan 31 '2010 15:01 dbasnett

NetworkInterface.GetIsNetworkAvailablees muy poco confiable. Simplemente tenga alguna conexión VMware u otra LAN y arrojará un resultado incorrecto. También sobre Dns.GetHostEntryel 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 InternetGetConnectedStateel 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);         
}
Kamran Shahid avatar Sep 11 '2014 05:09 Kamran Shahid

Una prueba de conexión a Internet haciendo ping a Google:

new Ping().Send("www.google.com.mx").Status == IPStatus.Success
Jaime Macias avatar Nov 13 '2012 18:11 Jaime Macias