我有一段C#代码,基本上使用 FtpWebRequest
协议上传文件。然而,我想首先确定是否存在可用的互联网连接,然后再尝试上传文件(因为如果没有可用互联网连接,尝试上传文件是毫无意义的,软件应该只需等待一段时间并再次检查)。
是否有简单的方法来实现这个功能?还是应该先尝试上传文件,如果失败了就再次尝试,假设网络连接已经中断?
我有一段C#代码,基本上使用 FtpWebRequest
协议上传文件。然而,我想首先确定是否存在可用的互联网连接,然后再尝试上传文件(因为如果没有可用互联网连接,尝试上传文件是毫无意义的,软件应该只需等待一段时间并再次检查)。
是否有简单的方法来实现这个功能?还是应该先尝试上传文件,如果失败了就再次尝试,假设网络连接已经中断?
存在一个"网络可用性更改"事件,当非隧道或回环接口上的网络连接状态从"断开"变为"连接"时触发。
您可以在启动时读取系统上所有网络适配器的状态,存储"网络可用性"的当前值,然后监听此事件,并在此事件触发时更改网络状态变量。这看起来也将处理拨号和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);
}
请记住,这只是一个近似值。当此方法返回时,计算机可能会失去或获得网络连接。我认为最好直接上传并处理错误,因为你无法证明这不会发生。
在尝试上传文件之前,您是否可以使用System.Net.NetworkInformation命名空间的Ping类来ping FTP服务器?
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
{
}
}