我有一个C#代码,基本上通过FTP协议上传文件(使用FtpWebRequest
)。但是,我想首先确定在尝试上传文件之前是否有可用的互联网连接(因为如果没有任何意义可以尝试,软件应该休眠一段时间再检查一次) 。如何检测C#中的工作Internet连接?
是否有一个简单的方法来做到这一点,或者我应该只是尝试上传的文件,并在情况下,它只是失败再试一次,假设网络连接中断?
我有一个C#代码,基本上通过FTP协议上传文件(使用FtpWebRequest
)。但是,我想首先确定在尝试上传文件之前是否有可用的互联网连接(因为如果没有任何意义可以尝试,软件应该休眠一段时间再检查一次) 。如何检测C#中的工作Internet连接?
是否有一个简单的方法来做到这一点,或者我应该只是尝试上传的文件,并在情况下,它只是失败再试一次,假设网络连接中断?
只需使用普通的功能
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
如果连接已启动,则返回true false。
From MSDN: 如果任何网络接口标记为“up”且不是环回或通道接口,则认为网络连接可用。
请记住连接不是全部,您可以连接到本地网络并且路由器未连接到Internet。要真正知道你是否连接到互联网,请尝试Ping课程。
我认为最好的逼近你可以使用是检查在NetworkInterface
类型OperationalStatus
值。
using System.Net.NetworkInformation;
public bool IsNetworkLikelyAvailable() {
return NetworkInterface
.GetAllNetworkInterfaces()
.Any(x => x.OperationalStatus == OperationalStatus.Up);
}
请记住,这是一个近似值。此方法返回计算机的那一刻可能会失去或获得互联网连接。海事组织我只是直接上传并处理错误,因为你无法证明它不会发生。
回想一下你的支票回来,并说这种情况“的连接是存在的”,和之前你就可以开始你的FTP,连接中断。
或当连接至您的FTP请求下降部分的方式。
鉴于你必须响应杰森的意见
你也可以有相反的情况,为这些情形反正代码,只需跳过检查
编辑发生 - 当您检查为了连接,没有一个存在,但一会儿之后,他们的连接就出现了。所以现在你做了什么 - 你是否开始唠叨用户关于没有连接的问题,尽管它现在可用?
在这一天结束时,你所面对的是大量的资源(你的网络连接,任何中间路由器,主机,它的FTP服务)。所有这些都可能在您的控制之外发生变化(正如Seth的评论所指出的那样),并且没有任何预测试可以回答“我能完成此上载”这个问题吗?
由于OP表示他正在考虑“退后一步”,所以我认为在后台完成所有这些操作并且根本不会惹恼用户是合适的 - 除非您一直在尝试对于“不合理”的时间而没有成功。
+1正在运行的网络连接并不意味着远程主机已启动并且有一个正在工作的FTP服务器。 – Seth 2010-03-26 07:23:26
好的答案,但我认为你是在回头看:如果你没有连接,你的程序不应该尝试发起任何通信 - 你可以发现它锁定在超时和/或浪费CPU时间无果而终,试图通过死链接和/或向用户报告数百个愚蠢的错误。好的程序会优雅地检测到链接处于脱机状态,并停止尝试使用它。 – 2010-03-26 07:52:17
在尝试上传文件之前,您不能只使用System.Net.NetworkInformation Namespace的Ping Class来ping FTP服务器吗?
除非远程主机阻止ping请求,否则这将失败 - 这是一个很好的做法,也是一些大型托管提供程序的做法。 – 2010-03-26 08:44:24
是的,我认为这是显而易见的,所以我没有打扰提及它... 正如其他人已经注意到,没有办法绝对确定连接将在FTP请求的确切时间与任何一种检查,但我觉得ping是一个足够好的近似和一个非常简单的实现。 – 2010-03-26 16:01:11
有一个“网络可用性改变”事件时触发时的界面上的网络连接的变化“向上”状态不是隧道或回送。
你可以在启动时读取系统上的所有网络适配器的状态,存储的当前值“网络可用”后来听此事件,并改变你的网络状态变量时,该事件触发。这看起来也可以处理拨号和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表示环回和隧道不代表连接。希望在尝试执行接受的答案之前,我会先阅读您的答案... – colithium 2010-10-03 15:16:13
如果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
{
}
}
大家好!首先,感谢您的答案!我会用JaredPar的优雅回答。 @Damien:我知道很多事情可能发生,我只是想做一个简单的事情:有没有网络连接?没有?回来30分钟。是?好的,让我们尝试上传。做法。有了JaredPar的代码,它不应该那么难。没什么更复杂的。尽管如此,谢谢你的回答。 @kzen:Pinging并不是一个很好的答案。举个例子,我的公司阻止了ICMP请求,所以即使在工作连接的情况下,检查它也会失败。不管怎么说,还是要谢谢你! – Detariael 2010-03-27 07:09:13
Andy Shellam:你的答案与JaredPar的基本相同,我没有选择它,只是因为我觉得JaredPar看起来更优雅。无论如何感谢您的回答! – Detariael 2010-03-27 07:10:33
由zyo将指定的anwser切换到一个,因为它包含环回/隧道。 – Detariael 2011-10-25 13:30:23