Sur Internet, il existe plusieurs endroits qui vous montrent comment obtenir une adresse IP. Et beaucoup d'entre eux ressemblent à cet exemple:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using 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());
}
Console.ReadLine();
Avec cet exemple, j'obtiens plusieurs adresses IP, mais je ne souhaite obtenir que celle que le routeur attribue à l'ordinateur exécutant le programme: l'adresse IP que je donnerais à quelqu'un s'il souhaite accéder à un dossier partagé sur mon ordinateur pour exemple.
Si je ne suis pas connecté à un réseau et que je suis connecté à Internet directement via un modem sans routeur, je voudrais obtenir une erreur. Comment puis-je voir si mon ordinateur est connecté à un réseau avec C # et si c'est pour obtenir l'adresse IP LAN.
c#
networking
Tono Nam
la source
la source
If I am not connected to a network and I am connected to the internet
Cette affirmation semble contradictoire. Essayez-vous de savoir si votre ordinateur est connecté à un réseau local privé ou à Internet?Réponses:
Pour obtenir l'adresse IP locale:
Pour vérifier si vous êtes connecté ou non:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
la source
Il existe un moyen plus précis lorsqu'il existe plusieurs adresses IP disponibles sur la machine locale.
Connect
un socket UDP et lire son point de terminaison local:Connect
sur un socket UDP a l'effet suivant: il définit la destination deSend
/Recv
, rejette tous les paquets provenant d'autres adresses, et - ce que nous utilisons - transfère le socket dans l'état "connecté", définit ses champs appropriés. Cela comprend la vérification de l'existence de l'itinéraire vers la destination en fonction de la table de routage du système et la définition du point de terminaison local en conséquence. La dernière partie ne semble pas être officiellement documentée, mais elle ressemble à un trait intégral de l'API des sockets Berkeley (un effet secondaire de l'état "connecté" UDP) qui fonctionne de manière fiable dans Windows et Linux à travers les versions et les distributions.Ainsi, cette méthode donnera l'adresse locale qui serait utilisée pour se connecter à l'hôte distant spécifié. Il n'y a pas de connexion réelle établie, l'IP distante spécifiée peut donc être inaccessible.
la source
Refactorisation du code de Mrcheif pour exploiter Linq (c'est-à-dire .Net 3.0+). .
:)
la source
Je sais que cela peut donner un coup de pied à un cheval mort, mais cela peut peut-être aider quelqu'un. J'ai cherché partout un moyen de trouver mon adresse IP locale, mais partout où je trouve, il est dit d'utiliser:
Je n'aime pas ça du tout parce qu'il obtient juste toutes les adresses attribuées à votre ordinateur. Si vous avez plusieurs interfaces réseau (ce que presque tous les ordinateurs font de nos jours), vous ne savez pas quelle adresse va avec quelle interface réseau. Après avoir fait un tas de recherches, j'ai créé une fonction pour utiliser la classe NetworkInterface et en extraire les informations. De cette façon, je peux dire de quel type d'interface il s'agit (Ethernet, sans fil, bouclage, tunnel, etc.), qu'elle soit active ou non, et SOOO beaucoup plus.
Maintenant, pour obtenir l'adresse IPv4 de votre appel d'interface réseau Ethernet:
Ou votre interface sans fil:
Si vous essayez d'obtenir une adresse IPv4 pour une interface sans fil, mais que votre ordinateur n'a pas de carte sans fil installée, il renverra simplement une chaîne vide. Même chose avec l'interface Ethernet.
J'espère que cela aide quelqu'un! :-)
ÉDITER:
Il a été souligné (merci @NasBanov) que même si cette fonction permet d'extraire l'adresse IP d'une bien meilleure manière que de l'utiliser,
Dns.GetHostEntry(Dns.GetHostName())
elle ne réussit pas très bien à prendre en charge plusieurs interfaces du même type ou plusieurs adresses IP sur une seule interface. . Il ne renverra une seule adresse IP que si plusieurs adresses peuvent être attribuées. Pour renvoyer TOUTES ces adresses attribuées, vous pouvez simplement manipuler la fonction d'origine pour toujours renvoyer un tableau au lieu d'une seule chaîne. Par exemple:Maintenant, cette fonction retournera TOUTES les adresses attribuées pour un type d'interface spécifique. Maintenant, pour obtenir une seule chaîne, vous pouvez utiliser l'
.FirstOrDefault()
extension pour renvoyer le premier élément du tableau ou, s'il est vide, renvoyer une chaîne vide.la source
item.OperationalStatus
revient toujoursUnknown
.Voici une version modifiée (de celle de compman2408) qui a fonctionné pour moi:
Vous pouvez appeler cette méthode par exemple comme:
Le changement: je récupère l'IP à partir d'un adaptateur auquel une passerelle IP a été affectée. Deuxième changement: j'ai ajouté des docstrings et une instruction break pour rendre cette méthode plus efficace.
la source
break
dans le plus intérieurif
ou unreturn
ferait l'affaire.C'est le meilleur code que j'ai trouvé pour obtenir l'adresse IP actuelle, en évitant d'obtenir l'hôte VMWare ou une autre adresse IP non valide.
la source
Je pense que l'utilisation de LinQ est plus facile:
la source
Pour rire, j'ai pensé essayer d'obtenir une seule instruction LINQ en utilisant le nouvel opérateur C # 6 à condition nulle. Semble assez fou et probablement horriblement inefficace, mais cela fonctionne.
Logique gracieuseté de
Gerardo H
(et par référencecompman2408
).la source
Autre moyen d'obtenir IP en utilisant l'expression linq:
la source
@mrcheif J'ai trouvé cette réponse aujourd'hui et elle a été très utile même si elle a renvoyé une mauvaise adresse IP (pas à cause du code qui ne fonctionne pas) mais elle a donné la mauvaise adresse IP interréseau lorsque vous avez des choses comme Himachi en cours d'exécution.
la source
192.0.0.0/8
pas un test correct pour une adresse IP privée (il y a 3 plages, toutes différentes de celle-ci), il peut aussi s'agir d'une plage de réseau d'entreprise, donc pas tellement "locale".Testé avec une ou plusieurs cartes LAN et machines virtuelles
la source
Juste une version mise à jour de la mienne utilisant LINQ:
la source
Pré-requis: vous devez ajouter la référence System.Data.Linq et la référencer
la source
J'avais également du mal à obtenir la bonne adresse IP.
J'ai essayé une variété de solutions ici, mais aucune ne m'a fourni l'effet souhaité. Presque tous les tests conditionnels fournis n’ont pas permis d’utiliser d’adresse.
C'est ce qui a fonctionné pour moi, j'espère que cela aide ...
la source
la source
Gardez à l'esprit que, dans le cas général, vous pouvez avoir plusieurs traductions NAT en cours et plusieurs serveurs DNS, chacun fonctionnant sur des niveaux de traduction NAT différents.
Que faire si vous avez un NAT de classe opérateur et que vous souhaitez communiquer avec d'autres clients du même opérateur? Dans le cas général, vous ne savez jamais avec certitude car vous pouvez apparaître avec des noms d'hôtes différents à chaque traduction NAT.
la source
Obsolète disparu, cela fonctionne pour moi
la source
En mettant à jour la réponse de Mrchief avec Linq, nous aurons:
la source
Cela renvoie les adresses de toutes les interfaces qui ont des adresses de passerelle et des adresses de monodiffusion dans deux listes distinctes, IPV4 et IPV6.
la source
Il y a déjà beaucoup de réponses, mais j'apporte toujours la mienne:
Bon mot:
Remarque: recherchez à partir du dernier car cela fonctionnait toujours après l'ajout de certaines interfaces dans l'appareil, telles que MobileHotspot, VPN ou autres adaptateurs virtuels fantaisistes.
la source
De plus, un code simple pour obtenir Client Ip:
J'espère que cela vous aidera.
la source
la source
Code de compman2408 modifié pour pouvoir parcourir chacun d'eux
NetworkInterfaceType
.Et vous pouvez l'appeler ainsi:
la source
En dessous de la même action
Fonction LocalIP ()
Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Hôte
Retour vrai
Fonction de fin
la source
une ligne de code: D
la source
Si vous avez des machines virtuelles ou des cartes réseau supplémentaires, il peut y avoir d'autres valeurs dans la liste d'adresses. Ma suggestion est de vérifier les entrées de la liste d'adresses et d'imprimer ce qui est approprié. Dans mon cas, l'entrée 3 était l'adresse IPv4 de ma machine
N'oubliez pas d'ajouter
using System.Net;
la source