如何知道我是否';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中)?使用哪个索引?我如何知道我是否连接到局域网或互联网,或者根本没有连接?请澄清。

如何知道我是否';m是否连接到网络

有几种方法可以做到这一点(我认为您可以使用[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
}