如何在C#中检测工作的互联网连接?

时间:2010-03-26 06:58:04

标签: c# ftpwebrequest internet-connection

7 个答案:

答案 0 :(得分:32)

只需使用普通功能

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

如果连接已启动,则返回true。

From MSDN: 如果任何网络接口标记为“up”且不是环回或隧道接口,则认为网络连接可用。

请记住连接不是全部,您可以连接到本地网络,例如路由器未连接到Internet。要真正了解您是否已连接到互联网,请尝试Ping课程。

答案 1 :(得分:14)

当网络连接的“up”状态在非隧道或环回的接口上发生更改时,会发生“网络可用性已更改”事件。

您可以在启动时读取系统上所有网络适配器的状态,存储“网络可用”的当前值,然后监听此事件并在此事件触发时更改网络状态变量。这看起来也会处理拨号和ISDN连接。

当然还有其他因素需要考虑,例如NIC连接到路由器(并且工作)但路由器上的Internet连接已关闭,或者远程主机没有响应,但这至少会阻止如果没有开始的网络连接(例如VPN或ISDN链接已关闭),您尝试建立无法正常工作的连接。

这是一个C#控制台应用程序 - 启动它,然后禁用或拔掉网络连接: - )

class Program
{
    static bool networkIsAvailable = false;

    static void Main(string[] args)
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface nic in nics)
        {
            if (
                (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) &&
                nic.OperationalStatus == OperationalStatus.Up)
            {
                networkIsAvailable = true;
            }
        }

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);

        NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);

        Console.ReadLine();
    }

    static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        networkIsAvailable = e.IsAvailable;

        Console.Write("Network availability: ");
        Console.WriteLine(networkIsAvailable);
    }
}

答案 2 :(得分:12)

我认为您可以使用的最佳近似值是检查OperationalStatus类型上的NetworkInterface值。

using System.Net.NetworkInformation;

public bool IsNetworkLikelyAvailable() {
  return NetworkInterface
    .GetAllNetworkInterfaces()
    .Any(x => x.OperationalStatus == OperationalStatus.Up);
}

请记住,这是近似值。此方法返回计算机的那一刻可能会失去或获得它的互联网连接。 IMO我会直接上传并处理错误,因为你无法证明它不会发生。

答案 3 :(得分:6)

考虑一下您的支票回来的情况,并说“连接在那里”,在您启动FTP之前,连接就会丢失。

或者连接在FTP请求中断的部分。

鉴于你必须为这些情况编码,只需跳过检查

编辑以回应杰森的评论

您也可能出现相反的情况 - 当您检查连接时,不存在,但片刻之后,它们的连接就会出现。那么现在你做了什么 - 你是否开始唠叨用户没有连接,即使它现在可用了?

在一天结束时,您正在处理大量资源(您的网络连接,任何中间路由器,主机,其FTP服务)。所有这些都可能在您无法控制的情况下发生变化(如Seth的评论所示),并且没有任何预测试将回答“我能否完成此上传”的问题?

由于OP表示他正在考虑“后退并再试一次”的方法,所以我认为在后台完成所有这些并且根本不会惹恼用户是合适的 - 除非你一直在尝试一段“不合理”的时间没有成功。

答案 4 :(得分:6)

在尝试上传文件之前,您是否只能使用Ping ClassSystem.Net.NetworkInformation Namespace ping FTP服务器?

答案 5 :(得分:5)

如果ping很困难,只需使用webclient。

public static bool CheckForInternetConnection()
{
   try
   {
       using (var client = new WebClient())
       using (var stream = client.OpenRead("http://www.google.com"))
       {
          return true;
       }
   }
   catch
   {
       return false;
   }
}

或任何其他网站。 编辑:您可以使用http://www.msftncsi.com/此网站。这是仅为互联网连接运行的站点。请参阅有关Windows 7如何找到Internet连接 http://blog.superuser.com/2011/05/16/windows-7-network-awareness/

的详细注册表说明

答案 6 :(得分:1)

只是写了异步函数来做到这一点:

    private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
    {
        if (e.Cancelled)
            return;

        if (e.Error != null)
            return;

        if (e.Reply.Status == IPStatus.Success)
        {
            //ok connected to internet, do something...
        }
    }

    private void checkInternet()
    {
        Ping myPing = new Ping();
        myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
        try
        {
            myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
        }
        catch
        {
        }
    }