Comment déterminer si une adresse IP provient du même réseau local par programme dans .NET C #

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

  •  03-07-2019
  •  | 
  •  

Question

Je sais que si une adresse IP ne relève pas du masque de sous-réseau + des règles IP locales, elle ne sera accessible que via une passerelle. Le problème est que je ne sais pas comment obtenir l'adresse IP locale, ni le masque de sous-réseau local, à l'aide de programmes .NET. Quelqu'un parmi vous peut m'aider?

Je vais utiliser ces informations pour optimiser les performances de ma file d'attente d'insertion SQL par lots. Si le serveur SQL tombe dans le même sous-réseau, il utilisera un algorithme optimisé pour une latence minimale, sinon, je vais en utiliser un optimisé pour une latence élevée.

Était-ce utile?

La solution

Vous pouvez utiliser les classes de l'espace de noms System.Net.NetworkInformation (introduit dans .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
                    );
            }
        }

Autres conseils

Il existe un autre moyen d'utiliser 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();
    }
}

L'exemple de code est un mashup des exemples fournis par Msdn, simplifié pour afficher uniquement les informations dont vous avez probablement besoin.

EDIT: Il m’a fallu trop de temps (trop de choses en même temps :)) pour écrire ce billet, et Mitch m’a battu:)

Ceci vous donnera le nom d'hôte et l'adresse IP. Je suppose que vous connaissez les adresses IP de votre réseau local. Vous devriez donc pouvoir déterminer si l'adresse IP se trouve en dehors du réseau local de cette façon:

// 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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top