在蜂窝网络上测试互联网连接
本文关键字:测试 互联网 连接 网络 | 更新日期: 2023-09-27 18:12:08
我有一个为远程卡车编写的应用程序,用于手机服务。在我做任何事情之前,我用这个类检查互联网:
using System.Net;
namespace SSS.ServicesConfig.MiscClasses
{
public class VerifyInternetAccess
{
public static bool HasInternet()
{
try
{
using (var client = new WebClient())
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
catch
{
return false;
}
}
}
}
在某些情况下,外部蜂窝设备上的灯是绿灯,就好像它有互联网一样。我的测试类返回false,所以它认为它没有互联网。
驱动程序可以打开浏览器,关闭浏览器,立即运行我的应用程序,它通过了上面的测试。
用户说IE正在"唤醒"互联网以便它可以传输。
我的类不做本质上相同的事情吗?如果没有,我怎样才能像IE那样"唤醒"互联网连接?
您没有说明您是否仅限于某个移动操作系统,但这适用于普通的机器。我尝试利用System.Net.NetworkInformation名称空间的两个特性。
我从注册NetworkChangedEvent开始。通过调用GetIsNetworkAvailable,您可以了解是否存在至少一个非环回接口的其他网卡。
如果没有连接,我尝试通过ping主机来唤醒网络层。我使用Dns。GetHostEntry获取主机已知的所有IP地址。接下来,我尝试逐一Ping地址。
请注意,并非所有主机都允许ICMP通信,这在所有情况下都会导致超时。但是,如果在此期间网络可用,则应该触发NetworkChanged事件并将HasConnection
设置为true
public class VerifyInternetAccess
{
private static bool HasConnection = false;
static VerifyInternetAccess()
{
NetworkChange.NetworkAvailabilityChanged += (o, ca) =>
{
HasConnection = ca.IsAvailable;
};
HasConnection = NetworkInterface.GetIsNetworkAvailable();
}
public static bool HasInternet()
{
bool hasEnded = false;
if (!HasConnection)
{
// let's try to wake up...
using (var ping = new Ping())
{
var iphost = Dns.GetHostEntry("www.google.com");
foreach (var addr in iphost.AddressList)
{
var reply = ping.Send(addr);
if (reply.Status == IPStatus.Success)
{
HasConnection = true;
break;
}
}
}
}
return HasConnection;
}
}