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

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

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

只需使用普通function

 System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

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

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

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

有一个“网络可用性已更改”事件,当网络连接的“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); } } 

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

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

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

在尝试上传文件之前,您是否只能使用System.Net.NetworkInformation命名空间的Ping类来ping FTP服务器?

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

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

鉴于您无论如何都必须为这些情况编码 ,只需跳过检查即可

编辑以回应杰森的评论

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

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

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

如果您很难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如何找到互联网连接的详细注册表说明http://blog.superuser.com/2011/05/16/windows-7-network-awareness/

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

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