Pergunta

Eu sei que, se um IP cai fora a máscara regras + IP local de sub-rede, será apenas acessível através de um Gateway. O problema é que eu não sei como obter o endereço IP local, nem a máscara de sub-rede local, através de programação usando .NET. Qualquer um de vocês pode me ajudar?

Vou usar esta informação para espremer o máximo desempenho do meu lote fila de inserção SQL. Se o servidor SQL cai na mesma sub-rede, então ele vai usar um algoritmo otimizado para latência mininum, caso contrário, um uso vou otimizado para alta latência.

Foi útil?

Solução

Você pode usar as classes dentro do namespace System.Net.NetworkInformation (introduzido no .NET 2.0):

        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface iface in interfaces)
        {
            IPInterfaceProperties properties = iface.GetIPProperties();

            foreach (UnicastIPAddressInformation address in properties.UnicastAddresses)
            {
                Console.WriteLine(
                    "{0} (Mask: {1})",
                    address.Address,
                    address.IPv4Mask
                    );
            }
        }

Outras dicas

Há uma maneira alternativa usando o NetworkInformation classe:

public static void ShowNetworkInterfaces()
{
    // IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    if (nics == null || nics.Length < 1)
    {
        Console.WriteLine("  No network interfaces found.");
        return;
    }

    Console.WriteLine("  Number of interfaces .................... : {0}", nics.Length);
    foreach (NetworkInterface adapter in nics)
    {
        IPInterfaceProperties properties = adapter.GetIPProperties();
        Console.WriteLine();
        Console.WriteLine(adapter.Description);
        Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length,'='));
        Console.WriteLine("  Interface type .......................... : {0}", adapter.NetworkInterfaceType);
        Console.WriteLine("  Physical Address ........................ : {0}", adapter.GetPhysicalAddress().ToString());
        string versions ="";

        // Create a display string for the supported IP versions.
        if (adapter.Supports(NetworkInterfaceComponent.IPv4))
        {
            versions = "IPv4";
        }
        if (adapter.Supports(NetworkInterfaceComponent.IPv6))
        {
            if (versions.Length > 0)
            {
                versions += " ";
            }
            versions += "IPv6";
        }
        Console.WriteLine("  IP version .............................. : {0}", versions);
        UnicastIPAddressInformationCollection uniCast = properties.UnicastAddresses;
        if (uniCast != null)
        {
            foreach (UnicastIPAddressInformation uni in uniCast)
            {
                Console.WriteLine("  Unicast Address ......................... : {0}", uni.Address);
                Console.WriteLine("     Subnet Mask  ......................... : {0}", uni.IPv4Mask);
            }
        }
    Console.WriteLine();
    }
}

O exemplo de código é uma forma mashup os exemplos fornecidos por Msdn, simplificado para mostrar apenas as informações que você provavelmente precisará.

EDIT: Levei muito tempo (muitas coisas ao mesmo tempo :)) para fazer este post, e Mitch chegou antes de mim:)

Isso vai te dar o nome do host eo endereço IP. Eu estou supondo que você conhece os IPs na sua LAN para que você deve ser capaz de determinar se o endereço IP está fora da LAN dessa forma:

// Get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);

// Using the host name, get the IP address list.
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
     Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top