2

我希望我的应用程序在连接可用时连接到服务器(以检查更新),但当连接不可用时什么也不做。我担心每当我的程序尝试这样做时,具有拨号连接的人可能会收到其中一个提示来拨打他们的 ISP。我意识到现在很少有人使用拨号上网,但仍然如此。

我自己已经关闭拨号十多年了,所以老实说,我不知道WebRequest在离线时执行 HTTP 请求(例如使用 a )是否会显示这样的“拨号”提示。会吗?如果是这样,我怎样才能检查更新而不引起这样的提示?

4

2 回答 2

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

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

于 2012-12-27T19:19:01.223 回答
0

WinInet Api实现的功能:

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

可以在此处找到特定 API 调用的详细信息


编辑: 我提供了一个可用于测试的小代码示例。
值得注意的是,在底层,My.Computer.Network.IsAvailableP/Invokes并在丢弃标志的同时InternetGetConnectedState简单地返回一个真/假值。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.IsAvailableP/ Invokes。InternetGetConnectedState在 WinNt 及更高版本上,它通过网络接口枚举并为第一个连接的接口返回 true。所以,要么

My.Computer.Network.IsAvailable  'vb.net

或者

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

是可行的解决方案。

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

于 2012-12-27T19:26:20.967 回答