如何在C#中检测工作的internet连接?

如何在C#中检测工作的internet连接?,c#,ftpwebrequest,internet-connection,C#,Ftpwebrequest,Internet Connection,我有一个C代码,基本上是通过FTP协议上传文件的(使用FtpWebRequest)。然而,在尝试上传文件之前,我想首先确定是否有工作的internet连接(因为,如果没有,那么尝试没有意义,软件应该只休眠一段时间,然后再次检查) 是否有一种简单的方法可以做到这一点,或者我应该尝试上传文件,如果失败,只要再次尝试,假设网络连接已断开?我认为您可以使用的最佳近似值是检查网络接口类型上的操作状态值 using System.Net.NetworkInformation; public bool Is

我有一个C代码,基本上是通过FTP协议上传文件的(使用
FtpWebRequest
)。然而,在尝试上传文件之前,我想首先确定是否有工作的internet连接(因为,如果没有,那么尝试没有意义,软件应该只休眠一段时间,然后再次检查)


是否有一种简单的方法可以做到这一点,或者我应该尝试上传文件,如果失败,只要再次尝试,假设网络连接已断开?

我认为您可以使用的最佳近似值是检查
网络接口
类型上的
操作状态

using System.Net.NetworkInformation;

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

记住,尽管这是一个近似值。当此方法返回时,计算机可能会失去或获得其internet连接。在我看来,我会直接去上传并处理错误,因为你无法证明它不会发生。

想想你的支票返回并显示“连接在那里”的情况,在你启动FTP之前,连接会断开

或者通过FTP请求部分断开连接

鉴于您必须为这些情况编写代码,只需跳过检查即可

根据Jason的评论进行编辑

您也可以出现相反的情况-当您检查连接时,没有连接存在,但过一会儿,他们的连接出现。那么现在你该怎么办呢?你是否开始抱怨用户没有连接,即使现在连接可用

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

正如OP所指出的,他正在考虑一种“退后再试”的方法,那么我认为在后台进行所有这些操作是合适的,并且根本不会惹恼用户——除非你一直在尝试一种“不合理的”未成功的时间量。

在尝试上载文件之前,是否可以使用ping命令对FTP服务器进行ping操作?

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

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

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

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


只需使用普通函数

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
如果连接断开,则返回true或false

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


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

如果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;
   }
}
或任何其他网站。
编辑:您可以使用此网站。这是一个仅为internet连接而运行的站点。有关windows 7如何查找internet连接的详细注册表说明,请参见刚刚编写的异步函数:

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

+1“网络连接正常”并不意味着远程主机已启动,并且有一个正常工作的FTP服务器。答案很好,但我认为您是在背对背地看:如果您没有连接,您的程序不应该尝试启动任何通信-您可能会发现它在超时时被锁定和/或在无效的尝试上浪费CPU时间通过死链接进行通信和/或向用户报告数百个愚蠢的错误。好的程序将优雅地检测到链接处于脱机状态并停止尝试使用它。但如果远程主机阻止ping请求,这将失败-这是一种良好的做法,一些大型主机提供商也会这样做。是的,我认为这是显而易见的,所以我没有提及它。。。正如其他人已经注意到的那样,通过任何形式的检查都无法绝对确定FTP请求的确切时间连接是否可用,但我觉得ping是一个足够好的近似值,并且是一个非常简单的实现方法。大家好!首先,谢谢你的回答!我同意JaredPar关于优雅的回答@达米恩:我知道很多事情都可能发生,我只想做一个简单的事情:有网络连接吗?不30分钟后回来。对好的,让我们试试上传。方法用JaredPar的代码应该没那么难。没有比这更复杂的了。谢谢你的回答@kzen:Pinging并不是一个很好的答案。一、 首先,我的公司阻止了ICMP请求,所以即使连接正常,用这种方式检查也会失败。无论如何谢谢你!安迪·谢勒姆:你的答案基本上和杰雷德帕的一样,我没有选择它,只是因为我觉得杰雷德帕看起来更优雅。无论如何,谢谢你的回答!将接受的anwser切换到Zyo提供的anwser,因为它包括环回/隧道。首先查找ip od任何网卡第二次使用此页面[在此处输入链接说明][1][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
        {
        }
    }