【问题标题】:How to detect working internet connection in C#?如何在 C# 中检测有效的 Internet 连接?
【发布时间】:2011-02-01 01:40:10
【问题描述】:

我有一个 C# 代码,它基本上通过 FTP 协议上传文件(使用 FtpWebRequest)。但是,我想在尝试上传文件之前先确定是否有可用的互联网连接(因为,如果没有尝试,软件应该只是休眠一段时间并再次检查) .

是否有一种简单的方法可以做到这一点,或者我应该尝试上传文件,万一它失败了,假设网络连接已关闭再试一次?

【问题讨论】:

  • 大家好!首先,感谢您的所有回答!我会选择 JaredPar 的优雅回答。 @Damien:我知道可能会发生很多事情,我只想做一个简单的事情:有网络连接吗?不? 30分钟后回来。是的?好的,让我们尝试上传。方法。使用 JaredPar 的代码应该不会那么难。没有什么比这更复杂了。不过还是谢谢你的回答。 @kzen:Pinging 并不是一个很好的答案。一方面,我在公司中阻止了 ICMP 请求,因此即使连接正常,以这种方式检查也会失败。还是谢谢!
  • Andy Shellam:你的答案和 JaredPar 基本一样,我没有选择它只是因为我觉得 JaredPar 看起来更优雅。无论如何感谢您的回答!
  • 将接受的 anwser 切换到 Zyo 的那个,因为它包括环回/隧道。
  • 先找到 ip od 任何网卡第二次使用这个stackoverflow.com/questions/3690472/…
  • 使用此页面[在此处输入链接描述][1] [1]:stackoverflow.com/questions/3690472/…

标签: c# ftpwebrequest internet-connection


【解决方案1】:

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

using System.Net.NetworkInformation;

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

请记住,虽然这是一个近似值。当此方法返回时,计算机可能会丢失或获得 Internet 连接。 IMO 我会直接上传并处理错误,因为您无法证明它不会发生。

【讨论】:

  • 这可能会返回环回接口和您设置的任何隧道接口。即使这些报告中的任何一个报告为“向上”,您也应该报告“否”。我知道无论互联网状态如何,环回几乎总是报告“Up”。
  • 感谢 JaredPar,您让我的应用程序设计变得轻松多了。
【解决方案2】:

想想你的支票回来说“连接在那里”的情况,在你可以启动你的 FTP 之前,连接断开了。

或者连接在您的 FTP 请求中途中断的地方。

鉴于无论如何您都必须为这些情况编写代码,请跳过检查

编辑以响应 Jason 的 cmets

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

归根结底,您要处理大量资源(您的网络连接、任何中间路由器、主机、它的 FTP 服务)。所有这些都可能在您的控制范围之外发生变化(正如 Seth 的评论所示),并且没有任何预测试可以回答“我能够完成此上传”这个问题吗?

正如 OP 表示他正在考虑“退后并稍后重试”的方法,那么我认为在后台执行所有这些操作并且根本不会惹恼用户是合适的 - 除非您一直在尝试没有成功的“不合理”时间。

【讨论】:

  • +1 一个工作的网络连接并不意味着远程主机已经启动并且有一个工作的 FTP 服务器。
  • 很好的答案,但我认为您正在从头再来:如果您没有连接,您的程序不应尝试启动任何通信 - 您可能会发现它已锁定超时和/或浪费 CPU 时间尝试通过死链接进行对话和/或向用户报告数百个愚蠢的错误。好的程序会优雅地检测到链接离线并停止尝试使用它。
【解决方案3】:

您不能在尝试上传文件之前使用System.Net.NetworkInformation NamespacePing Class ping FTP 服务器吗?

【讨论】:

  • 如果远程主机阻止 ping 请求,这将失败 - 这是一种很好的做法,一些大型托管服务提供商会这样做。
  • 是的,我认为这很明显,所以我没有费心提及它......正如其他人已经注意到的那样,没有办法绝对确定连接将在确切时间可用FTP 请求进行任何类型的检查,但我觉得 ping 是一个足够好的近似值,并且实现起来非常简单。
【解决方案4】:

当网络连接的“启动”状态在不是隧道或环回的接口上发生更改时,会触发“网络可用性更改”事件。

您可以在启动时读取系统上所有网络适配器的状态,存储“网络可用”的当前值,然后侦听此事件并在此事件触发时更改您的网络状态变量。这看起来也可以处理拨号和 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);
    }
}

【讨论】:

  • +1 表示环回和隧道并不代表连接。希望在尝试实施已接受的答案之前我会阅读您的答案...
【解决方案5】:

只需使用普通函数

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

如果连接成功则返回 true 或 false。

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

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

【讨论】:

  • 断开网线时,上述方法返回TRUE。
  • @mmmmmm 断开电缆并不意味着所有网络都不可用。例如,您可以使用 wifi。
  • Ping 类看起来像是要确定用户是否连接到互联网的方法。
【解决方案6】:

如果 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/

【讨论】:

    【解决方案7】:

    刚刚编写了异步函数来做到这一点:

        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
            {
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2023-03-31
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多