如何在不提示拨号对话框的情况下检查互联网连接是否可用?

时间:2012-12-27 17:38:37

标签: .net http dial-up

我希望我的应用程序在连接可用时连接到服务器(以检查更新),但在不连接时则不执行任何操作。我担心拨号连接的人可能会收到其中一个提示,以便在我的程序尝试时拨打他们的ISP。我意识到现在很少有人在拨号上,但仍然。

我自己已经拨号十多年了,所以我真的不知道在离线时执行HTTP请求(例如使用WebRequest)是否会显示这样的“拨号”提示。会吗?如果是这样,我如何在不引起此类提示的情况下检查更新?

2 个答案:

答案 0 :(得分:1)

使用这个:

My.Computer.Network.IsAvailable

也许这个:

    Dim available As Boolean
    Try
        Dim client As New System.Net.Sockets.TcpClient("google.com", 80)
        available = True
    Catch ex As Exception
        available = False
    End Try

如果结果“可用”,您可以检查更新是否可用。

答案 1 :(得分:0)

WinInet Api实现了这个功能:

BOOL InternetGetConnectedState(
  _Out_  LPDWORD lpdwFlags,
  _In_   DWORD dwReserved
);

可以找到特定API调用的详细信息here


修改 我提供了一个可用于测试的小代码示例 值得注意的是,My.Computer.Network.IsAvailable P / Invokes InternetGetConnectedState并在丢弃标志时简单地返回 true / false 值。 WinNt及其后来它通过网络接口进行枚举,并为第一个连接的接口返回true。

using System;

namespace InternetGetConnectedState
{
    [Flags]
    enum InternetConnectionFlags : uint
    {
        // Flags for InternetGetConnectedState and Ex
        Modem = 0x01,
        Lan = 0x02,
        Proxy = 0x04,
        ModemBusy = 0x08,  /* no longer used */
        RasInstalled = 0x10,
        Offline = 0x20,
        Configured = 0x40
    }

    class Program
    {
        [System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
        static extern bool InternetGetConnectedState(out InternetConnectionFlags flags, uint dwReserved);

        static void Main(string[] args)
        {
            InternetConnectionFlags flags;
            bool connectedState = InternetGetConnectedState(out flags, 0)

            // TODO:  Check Flags
        }
    }
}

编辑2: 在进一步检查ILSpy转储之后,在NT之前的Windows上My.Computer.Network.IsAvailable P /调用InternetGetConnectedState。在WinNt及更高版本中,它通过网络接口进行枚举,并为第一个连接的接口返回true。所以,要么

My.Computer.Network.IsAvailable  'vb.net

System.Net.NetworkInformation.GetIsNetworkAvailable(); // C#

是可行的解决方案。

也许禁用自动更新的选项是避免最终用户烦恼的另一种可能的解决方案。