如何使用 .NET 实现高效的网络连接性检查?

咨询区

  • Mohit Deshpande

我的项目有一个需求,需要检查网络的连通性,请问是否有高效的方式去实现?

回答区

  • Leo

虽然并不能完全可靠的实现网络连通性检查,因为你不能保证目标机永远在线,相比来说更高效的方式是用 Ping协议 而不是 Http协议,比如说你可以不断的 ping google.com,参考如下代码:

public static bool Isconnected = false;

public static bool CheckForInternetConnection()
{
    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);
        if (reply.Status == IPStatus.Success)
        {
            return true;
        }
        else if (reply.Status == IPStatus.TimedOut)
        {
            return Isconnected;
        }
        else
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }
}

public static void CheckConnection()
{
    if (CheckForInternetConnection())
    {
        Isconnected = true;
    }
    else
    {
        Isconnected = false;
    }
}

  • Jeshurun

android 手机也有检测 WIFI 连通性的代码,它非常高效的抓取 Google 首页,相应的 java 代码如下:

public static boolean hasInternetAccess(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) 
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e(TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(TAG, "No network available!");
    }
    return false;
}

转成 C# 代码的话,大概如下:

var request = (HttpWebRequest)WebRequest.Create("http://g.cn/generate_204");
request.UserAgent = "Android";
request.KeepAlive = false;
request.Timeout = 1500;

using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.ContentLength == 0 && response.StatusCode == HttpStatusCode.NoContent)
    {
        //Connection to internet available
    }
    else
    {
        //Connection to internet not available
    }
}

点评区

这个功能在带 GUI 的程序中大多属于刚需功能, ping 判断连通性是一个好办法,学习了。

上一篇:day 75 后天管理、 添加文章、修改用户头像


下一篇:zabbix4.0-配置文件:zabbix_server