Cómo determinar si una IP es de la misma LAN mediante programación en .NET C #

StackOverflow https://stackoverflow.com/questions/416524

  •  03-07-2019
  •  | 
  •  

Pregunta

Sé que si una IP queda fuera de las reglas de Máscara de subred + IP local, solo será accesible a través de una Puerta de enlace. El problema es que no sé cómo obtener la dirección IP local, ni la máscara de subred local, mediante programación .NET. ¿Alguno de ustedes puede ayudarme?

Usaré esta información para exprimir el máximo rendimiento de mi cola de inserción de SQL por lotes. Si el servidor SQL se encuentra en la misma subred, usará un algoritmo optimizado para la latencia mínima, de lo contrario, usaré uno optimizado para latencia alta.

¿Fue útil?

Solución

Puede usar las clases dentro del espacio de nombres System.Net.NetworkInformation (introducido en .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
                    );
            }
        }

Otros consejos

Hay una forma alternativa de utilizar NetworkInformation clase:

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();
    }
}

El ejemplo de código es un mashup de los ejemplos proporcionados por Msdn, simplificado para mostrar solo la información que probablemente necesite.

EDITAR: Me tomó demasiado tiempo (demasiadas cosas al mismo tiempo :)) para hacer esta publicación, y Mitch me dio una paliza :)

Esto le dará el nombre de host y la dirección IP. Supongo que usted conoce las IP en su LAN, por lo que debería poder determinar si la dirección IP está fuera de la LAN de esa manera:

// 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top