【问题标题】:testing internet connection on a cellular network在蜂窝网络上测试互联网连接
【发布时间】:2014-08-31 01:13:00
【问题描述】:

我有一个为远程卡车编写的应用程序,用于移动服务。在我做任何事情之前,我正在用这个类检查互联网:

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

在某些情况下,外部蜂窝设备上的指示灯会亮起绿灯,就好像它有互联网一样。我的测试类返回错误,所以它认为它没有互联网。

然后驱动程序可以打开Internet Explorer,关闭Internet Explorer,立即运行我的应用程序,它通过了上面的测试。

用户说 IE 正在“唤醒”互联网以便它可以传输。

我的班级不是在做同样的事情吗?如果没有,我怎样才能像 IE 一样“唤醒”互联网连接?

【问题讨论】:

  • 只是一个理论,但可能与 DNS 有关。您未能解析 www.google.com,并且 DNSCache 服务记住了这个结果,因此即使它应该正常工作,它也会一直失败,直到有什么东西给服务带来了刺激。您可以禁用 DNSCache 或仅使用 IP 地址测试您的互联网连接,例如您可以 ping 8.8.8.8。
  • 这里是另一个解决方案:social.msdn.microsoft.com/forums/en-US/…

标签: c# winforms .net-4.0 cellular-network


【解决方案1】:

您没有说明您是否受限于某个移动操作系统,但这适用于普通盒子。 我尝试利用 System.Net.NetworkInformation 命名空间的两个特性。

我首先注册NetworkChangedEvent。通过调用GetIsNetworkAvailable,您可以了解是否存在至少一个不是环回接口的其他 NIC。

如果没有连接,我会尝试通过 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;
    }
}

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2010-11-08
    相关资源
    最近更新 更多