31 votes

Interroger l'adresse IP locale

J'ai besoin de savoir mon adresse IP locale (c'est à dire pas l'adresse de bouclage) à partir d'un Windows 8 WinRT/Metro app. Il ya plusieurs raisons que j'ai besoin de cela. Le plus simple est que dans l'INTERFACE utilisateur de l'application que je voudrais montrer un peu de texte comme "Votre réseau local adresse IP est: [IP interrogées à partir d'un code]".

Nous utilisons aussi l'adresse pour avoir un peu de réseau de communications. Ces comms sont parfaitement valables, parce que tout cela fonctionne si je regarde l'adresse IP dans le Panneau de configuration, puis coder en dur dans l'application. Demander à l'utilisateur dans une boîte de dialogue pour aller chercher à l'adresse et entrer manuellement c'est quelque chose que j'ai vraiment, vraiment à éviter.

Je pense que ce ne serait pas une tâche complexe pour obtenir l'adresse de la programmation, mais mon moteur de recherche et StackOverflow compétences sont à venir vide.

À ce stade, je commence à envisager de faire une diffusion UDP/écouter en boucle entendre ma propre demande et de l'extrait de l'adresse, mais qui semble vraiment comme un hackey bidouille. Est-il une API quelque part dans le WinRT nouveau truc qui va me faire là-bas?

Notez que j'ai dit "WinRT app. Cela signifie que le typique mécanismes d' Dns.GetHostEntry ou NetworkInterface.GetAllInterfaces() ne vont pas au travail.

34voto

Phil Points 19299

Après beaucoup de creuser, j'ai trouvé les informations dont vous avez besoin à l'aide de NetworkInformation et le nom d'hôte.

NetworkInformation.GetInternetConnectionProfile récupère le profil de connexion associé avec la connexion internet actuellement utilisé par la machine locale.

NetworkInformation.GetHostNames récupère une liste de noms d'hôte. Ce n'est pas évident, mais cela comprend les adresses IPv4 et IPv6 comme des chaînes de caractères.

À l'aide de cette information, nous pouvons obtenir l'adresse IP de la carte réseau connectée à internet comme ceci:

public string CurrentIPAddress()
{
    var icp = NetworkInformation.GetInternetConnectionProfile();

    if (icp != null && icp.NetworkAdapter != null)
    {
        var hostname =
            NetworkInformation.GetHostNames()
                .SingleOrDefault(
                    hn =>
                    hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null
                    && hn.IPInformation.NetworkAdapter.NetworkAdapterId
                    == icp.NetworkAdapter.NetworkAdapterId);

        if (hostname != null)
        {
            // the ip address
            return hostname.CanonicalName;
        }
    }

    return string.Empty;
}

Notez que le nom d'hôte possède des propriétés CanonicalName, DisplayName et RawName, mais ils semblent tous de retour sur la même chaîne.

Nous pouvons également obtenir des adresses pour plusieurs cartes avec un code similaire à ceci:

private IEnumerable<string> GetCurrentIpAddresses()
{
    var profiles = NetworkInformation.GetConnectionProfiles().ToList();

    // the Internet connection profile doesn't seem to be in the above list
    profiles.Add(NetworkInformation.GetInternetConnectionProfile());

    IEnumerable<HostName> hostnames =
        NetworkInformation.GetHostNames().Where(h => 
            h.IPInformation != null &&
            h.IPInformation.NetworkAdapter != null).ToList();

    return (from h in hostnames
            from p in profiles
            where h.IPInformation.NetworkAdapter.NetworkAdapterId ==
                  p.NetworkAdapter.NetworkAdapterId
            select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X