如何知道我是否连接到网络?

时间:2012-03-06 10:01:21

标签: c# .net network-programming ip-address

我在VS 2010中使用.Net 4.0。 我可以将我的机器的IP地址检索为

string hostname = Dns.getHostName();
IPHostEntry host = Dns.getHostEntry(hostname);

现在host.AddressList是一个IP地址数组。

我注意到AddressList [0]什么都没有,AddressList [1]是环回地址。我不确定其他指数。

如果我在一台机器上创建了一台服务器并且想要将其IP填充到客户端(可能只是机器),那么我应该填充哪个IP(在host.AddressList中)?使用哪个索引? 我怎么知道我是连接到局域网还是互联网,还是根本没有连接? 请澄清。

3 个答案:

答案 0 :(得分:2)

这可能是此question的重复。

不要因为拥有有效的DNS服务器或多个IP而假设您已连接到互联网(或任何其他网络)。本地PC或路由器可能充当活动DNS,即使没有互联网连接或同一网络上的任何其他计算机也可以使用。有关可能的解决方案,请查看我上面链接的问题/答案。还有一个或两个示例只是为了检测是否存在活动的网络连接。

至于检测有效的互联网连接,我总是只是尝试在我想要连接的服务器上请求一些页面(可以与一些更新检查或新闻显示相结合),因为它可能很重要连接到某个特定的服务器(而不仅仅是一般的互联网连接)。

答案 1 :(得分:2)

有几种方法可以做到(我认为你可以使用[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一个已知的主机名,如Google或Microsoft(这也会检查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);
}

答案 2 :(得分:1)

使用此功能可以轻松找到互联网连接的状态:

[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
}