【问题标题】:How to know whether I'm connected to a network or not?如何知道我是否连接到网络?
【发布时间】:2012-03-23 19:07:04
【问题描述】:

我在 VS 2010 中使用 .Net 4.0。 我可以将我的机器的 IP 地址检索为

string hostname = Dns.getHostName();
IPHostEntry host = Dns.getHostEntry(hostname);

现在 host.AddressList 是一个 IPAddresses 数组。

我注意到 AddressList[0] 什么都不包含,AddressList[1] 是环回地址。我不确定其他指数。

如果我在一台机器上创建了一个服务器,并且它想将其 IP 填充到客户端(可能只是这台机器),那么我应该填充哪个 IP(在 host.AddressList 中)?使用哪个索引? 我如何知道我是连接到 LAN 还是 Internet,或者根本没有连接? 请澄清。

【问题讨论】:

    标签: c# .net network-programming ip-address


    【解决方案1】:

    这可能与 question 重复。

    不要仅仅因为拥有有效的 dns 服务器或多个 IP 就认为您已连接到互联网(或任何其他网络)。本地 PC 或路由器可能充当活动 DNS,即使没有 Internet 连接或同一网络上的任何其他机器也可以使用。对于可能的解决方案,请查看我上面链接的问题/答案。还有一两个示例只是为了检测是否存在活动的网络连接。

    至于检测活动的互联网连接,我总是尝试在我想连接的服务器上请求一些页面(可以结合一些更新检查或新闻显示),因为能够做到这一点可能很重要连接到某个特定的服务器(而不仅仅是一般的互联网连接)。

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点(我认为您可以使用 [2] 和 [3] 的组合)。

      解决方案 1

      如果您包含对Microsoft.VisualBasic 的引用,您可以使用Microsoft.VisualBasic.Devices.Network.IsAvailable 属性来检查网络连接是否可用(并在此条件发生变化时通知相关事件)。

      解决方案 2

      导入API函数查看:

      [Flags]
      enum InternetConnectionState : int
      {
          INTERNET_CONNECTION_MODEM = 0x1,
          INTERNET_CONNECTION_LAN = 0x2,
          INTERNET_CONNECTION_PROXY = 0x4,
          INTERNET_RAS_INSTALLED = 0x10,
          INTERNET_CONNECTION_OFFLINE = 0x20,
          INTERNET_CONNECTION_CONFIGURED = 0x40
      }
      
      [DllImport("WININET", CharSet=CharSet.Auto)]
      static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
      

      或者干脆使用System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 函数(更好的解决方案,唯一的缺点是它在客户端配置文件中仅从 4.0 开始支持)。

      解决方案 3

      Ping 已知主机名,例如 Google 或 Microsoft(这也会检查 DNS)。

      示例

      结合使用上述技术(在此示例中,我使用导入的 API,但您可能更喜欢另一种)。

      static class NetworkHelpers
      {
          public static bool IsNetworkConnectionAvailable()
          {
              InternetConnectionState state = InternetConnectionState.INTERNET_CONNECTION_OFFLINE;
              if (!InternetGetConnectedState(ref state, 0))
                  return false;
      
              if (state == InternetConnectionState.INTERNET_CONNECTION_OFFLINE)
                  return false;
      
              try
              {
                  System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                  System.Net.NetworkInformation.PingReply reply = ping.Send(KnownHostName, PingTimeout);
      
                  return reply.Status == System.Net.NetworkInformation.IPStatus.Success;
              }
              catch (System.Net.NetworkInformation.PingException)
              {
                  return false;
              }
          }
      
          private const string KnownHostName = "http://www.microsoft.com";
          private const int PingTimeout = 5000; // milliseconds
      
          [Flags]
          private enum InternetConnectionState : int
          {
              INTERNET_CONNECTION_MODEM = 0x1,
              INTERNET_CONNECTION_LAN = 0x2,
              INTERNET_CONNECTION_PROXY = 0x4,
              INTERNET_RAS_INSTALLED = 0x10,
              INTERNET_CONNECTION_OFFLINE = 0x20,
              INTERNET_CONNECTION_CONFIGURED = 0x40
          }
      
          [System.Runtime.InteropServices.DllImport("WININET", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
          private static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
      }
      

      【讨论】:

        【解决方案3】:

        使用这个可以很容易地找到互联网连接的状态:

        [DllImport("wininet.dll", Charset = Charset.auto)]
        private static extern bool InternetGetConnectedSate(ref InternetConnectionState_e lpdwFlags, int dwReserved);
        

        然后例如:

        if(InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0)
        {
            // do your internet stuff
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-05
          相关资源
          最近更新 更多