我希望我的应用程序在连接可用时连接到服务器(以检查更新),但在不连接时则不执行任何操作。我担心拨号连接的人可能会收到其中一个提示,以便在我的程序尝试时拨打他们的ISP。我意识到现在很少有人在拨号上,但仍然。
我自己已经拨号十多年了,所以我真的不知道在离线时执行HTTP请求(例如使用WebRequest
)是否会显示这样的“拨号”提示。会吗?如果是这样,我如何在不引起此类提示的情况下检查更新?
答案 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#
是可行的解决方案。
也许禁用自动更新的选项是避免最终用户烦恼的另一种可能的解决方案。