如何知道我是否';m是否连接到网络
本文关键字:是否 连接 网络 何知道 | 更新日期: 2023-09-27 18:26:45
我在VS 2010中使用.Net 4.0。我可以将我的机器的IP地址检索为
string hostname = Dns.getHostName();
IPHostEntry host = Dns.getHostEntry(hostname);
现在主持。AddressList是一个IPAddress数组。
我注意到AddressList[0]不包含任何内容,AddressList[1]是环回地址。我不确定其他指数。
如果我在一台机器上创建了一个服务器,并且它想将其IP填充到客户端(可能只是该机器),那么我应该填充哪个IP(在host.AddressList中)?使用哪个索引?我如何知道我是否连接到局域网或互联网,或者根本没有连接?请澄清。
有几种方法可以做到这一点(我认为您可以使用[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一个已知的主机名,如谷歌或微软(这也会检查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);
}
这可能是这个问题的重复。
不要仅仅因为拥有有效的dns服务器或多个IP就认为你连接到了互联网(或任何其他网络)。本地PC或路由器可能充当活动DNS,即使没有互联网连接或同一网络上的任何其他机器,也可以使用。关于可能的解决方案,请查看我上面链接的问题/答案。还有一个或两个示例仅用于检测活动网络连接的存在。
至于检测到活动的互联网连接,我总是尝试在我想连接的服务器上请求一些页面(可以与一些更新检查或新闻显示相结合),因为能够连接到某个特定的服务器(而不仅仅是普通的互联网连接)可能很重要。
使用以下方法可以很容易地找到互联网连接的状态:
[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
}