J'exécute un serveur et je souhaite afficher ma propre adresse IP.
Quelle est la syntaxe pour obtenir la propre adresse IP de l'ordinateur (si possible, externe)?
Quelqu'un a écrit le code suivant.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
Cependant, je me méfie généralement de l'auteur et je ne comprends pas ce code. Y a-t-il une meilleure façon de le faire?
c#
ip-address
Nefzen
la source
la source
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Réponses:
Non, c'est à peu près la meilleure façon de le faire. Comme une machine pourrait avoir plusieurs adresses IP, vous devez répéter leur collecte pour trouver la bonne.
Éditer: La seule chose que je voudrais changer serait de changer ceci:
pour ça:
Il n'y a pas besoin d'
ToString
une énumération pour comparaison.la source
break
déclaration après que l'IP a été trouvée pour éviter d'itérer inutilement plus loin dans la collection (dans ce cas, je doute que l'impact sur les performances aura de l'importance, mais j'aime souligner généralement de bonnes habitudes de codage)La seule façon de connaître votre adresse IP publique est de demander à quelqu'un d'autre de vous le dire; ce code peut vous aider:
la source
Plus propre et une solution tout-en-un: D
la source
Si vous ne pouvez pas compter sur l'obtention de votre adresse IP à partir d'un serveur DNS (ce qui m'est arrivé), vous pouvez utiliser l'approche suivante:
L'espace de noms System.Net.NetworkInformation contient une classe NetworkInterface , qui a une méthode statique GetAllNetworkInterfaces .
Cette méthode retournera toutes les "interfaces réseau" sur votre machine, et il y en a généralement un certain nombre, même si vous n'avez qu'un adaptateur sans fil et / ou un matériel adaptateur Ethernet installé sur votre machine. Toutes ces interfaces réseau ont des adresses IP valides pour votre machine locale, bien que vous n'en vouliez probablement qu'une seule.
Si vous recherchez une adresse IP, vous devrez filtrer la liste jusqu'à ce que vous puissiez identifier la bonne adresse. Vous aurez probablement besoin de faire quelques expériences, mais j'ai réussi avec l'approche suivante:
OperationalStatus == OperationalStatus.Up
. Cela exclura votre adaptateur Ethernet physique, par exemple, si vous n'avez pas de câble réseau branché.Pour chaque NetworkInterface, vous pouvez obtenir un objet IPInterfaceProperties à l'aide de la méthode GetIPProperties , et à partir d'un objet IPInterfaceProperties, vous pouvez accéder à la propriété UnicastAddresses pour une liste d' objets UnicastIPAddressInformation .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.À ce stade, je prends l'adresse de la première adresse unicast (le cas échéant) qui correspond à tous ces filtres.
ÉDITER:
[code révisé le 16 mai 2018 pour inclure les conditions mentionnées dans le texte ci-dessus pour l'état de détection d'adresse en double et la durée de vie préférée]
L'exemple ci-dessous illustre le filtrage basé sur l'état opérationnel, la famille d'adresses, à l'exclusion de l'adresse de bouclage (127.0.0.1), l'état de détection des adresses en double et la durée de vie préférée.
la source
la source
Je viens de tester cela sur ma machine et cela fonctionne.
la source
Si vous voulez éviter d'utiliser DNS:
la source
Ne comptez pas sur InterNetwork tout le temps car vous pouvez avoir plus d'un appareil qui utilise également IP4, ce qui gâcherait les résultats pour obtenir votre IP. Maintenant, si vous le souhaitez, vous pouvez simplement le copier et le consulter ou le mettre à jour à votre guise.
D'abord, j'obtiens l'adresse du routeur (passerelle) S'il revient que je suis connecté à une passerelle (ce qui signifie non connecté directement au modem sans fil ou non), alors nous avons notre adresse de passerelle comme IPAddress sinon nous avons un pointeur nul Référence IPAddress .
Ensuite, nous devons obtenir la liste des adresses IP de l'ordinateur. C'est là que les choses ne sont pas si difficiles car les routeurs (tous les routeurs) utilisent 4 octets (...). Les trois premiers sont les plus importants car tout ordinateur qui y est connecté aura l'adresse IP4 correspondant aux trois premiers octets. Ex: 192.168.0.1 est standard pour l'IP par défaut du routeur à moins qu'il ne soit modifié par l'administrateur de celui-ci. '192.168.0' ou quoi que ce soit, c'est ce que nous devons faire correspondre. Et c'est tout ce que j'ai fait dans la fonction IsAddressOfGateway. La raison de la correspondance de longueur est que toutes les adresses (qui ne concernent que l'ordinateur) n'ont pas la longueur de 4 octets. Si vous tapez netstat dans la cmd, vous constaterez que c'est vrai. Alors voilà. Oui, il faut un peu plus de travail pour vraiment obtenir ce que vous cherchez. Processus d'élimination. Et pour l'amour de Dieu, ne trouvez pas l'adresse en la cinglant, ce qui prend du temps car vous envoyez d'abord l'adresse à cingler, puis elle doit renvoyer le résultat. Non, travaillez directement avec les classes .Net qui traitent de votre environnement système et vous obtiendrez les réponses que vous recherchez quand cela ne concerne que votre ordinateur.
Maintenant, si vous êtes directement connecté à votre modem, le processus est presque le même car le modem est votre passerelle, mais le sous-masque n'est pas le même parce que vous obtenez les informations directement de votre serveur DNS via un modem et non masqué par le routeur servant le Internet pour vous, bien que vous puissiez toujours utiliser le même code car le dernier octet de l'IP attribué au modem est 1. Donc, si l'IP envoyée par le modem qui change est 111.111.111.1 ', vous obtiendrez 111.111.111. (Certains octet). Gardez à l'esprit que nous devons trouver les informations sur la passerelle, car il y a plus d'appareils qui traitent de la connectivité Internet que votre routeur et votre modem.
Maintenant, vous voyez pourquoi vous ne modifiez PAS les deux premiers octets 192 et 168 de votre routeur. Ceux-ci sont strictement distingués uniquement pour les routeurs et non pour l'utilisation d'Internet, ou nous aurions un problème grave avec le protocole IP et un double ping provoquant le crash de votre ordinateur. Image que l'IP de votre routeur assigné est 192.168.44.103 et que vous cliquez également sur un site avec cette IP. OMG! Votre ordinateur ne saura pas quoi envoyer. Crash juste là. Pour éviter ce problème, seuls les routeurs leur sont attribués et non pour une utilisation Internet. Laissez donc les deux premiers octets du routeur seuls.
la source
255.255.255.0
, et il le fera de manière assez compliquée IMO.Je pensais simplement que j'ajouterais la mienne, une ligne (même s'il existe déjà de nombreuses autres réponses utiles).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
la source
Pour obtenir l'adresse IP publique actuelle, il vous suffit de créer une page ASPX avec la ligne suivante sur l'événement de chargement de page:
la source
Si vous utilisez Intranet, vous pourrez obtenir l'adresse IP de la machine locale et sinon, vous obtiendrez une adresse IP externe avec ceci: Web:
Bureau:
la source
Regardez ici pour plus de détails.
Vous devez vous rappeler que votre ordinateur peut avoir plus d'une adresse IP (en fait, c'est toujours le cas) - alors laquelle êtes-vous après.
la source
Essaye ça:
la source
Peut-être que par IP externe, vous pouvez envisager (si vous êtes dans un contexte de serveur Web) d'utiliser ce
Je posais la même question que vous et je l'ai trouvée dans cet article stackoverflow.
Ça a marché pour moi.
la source
la source
la source
Simple ligne de code unique qui renvoie la première adresse IPV4 interne ou null s'il n'y en a pas. Ajouté comme commentaire ci-dessus, mais peut être utile à quelqu'un (certaines solutions ci-dessus renverront plusieurs adresses qui nécessitent un filtrage supplémentaire).
Il est également facile de retourner en boucle au lieu de null, je suppose avec:
la source
IPAddress.Loopback
? :)Pour trouver la liste d'adresses IP, j'ai utilisé cette solution
Mais j'aime personnellement la solution ci-dessous pour obtenir une adresse IP locale valide
la source
La solution LINQ:
la source
Voici comment je l'ai résolu. Je sais que si vous avez plusieurs interfaces physiques, cela pourrait ne pas sélectionner l'éth exact que vous souhaitez.
la source
La question ne dit pas ASP.NET MVC mais je laisse juste ceci ici de toute façon:
la source
Obtenez toutes les adresses IP sous forme de chaînes à l'aide de LINQ:
POUR FILTRER LES PERSONNES PRIVÉES ...
Définissez d'abord une méthode d'extension
IsPrivate()
:... Et puis utilisez-le pour filtrer les adresses IP privées:
la source
Cela fonctionne pour moi ... et devrait être plus rapide dans la plupart des cas (sinon tous) que d'interroger un serveur DNS. Merci à Dr. Wily's Apprentice ( ici ).
Tout comme référence, c'est le code de classe complet où je l'ai défini:
la source
Encore une autre façon d'obtenir votre adresse IP publique est d'utiliser le
resolve1.opendns.com
serveur d' OpenDNS avecmyip.opendns.com
comme demande.Sur la ligne de commande, c'est:
Ou en C # en utilisant le nuget DNSClient:
C'est un peu plus propre que de toucher les points de terminaison http et d'analyser les réponses.
la source
Et c'est pour obtenir toutes les adresses IP locales au format csv dans VB.NET
la source
Pour obtenir l'adresse IP distante de la manière la plus rapide possible. Vous devez utiliser un téléchargeur ou créer un serveur sur votre ordinateur.
L'inconvénient de l'utilisation de ce code simple: (ce qui est recommandé) est qu'il faudra 3 à 5 secondes pour obtenir votre adresse IP distante car le WebClient une fois initialisé prend toujours 3 à 5 secondes pour vérifier vos paramètres de proxy.
Voici comment je l'ai corrigé .. (la première fois prend encore 3-5 secondes) mais après cela, il obtiendra toujours votre adresse IP distante en 0-2 secondes en fonction de votre connexion.
la source