Gaukite vietinį IP adresą

Internete yra kelios vietos, rodančios, kaip gauti IP adresą. Ir daugelis jų atrodo taip:

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

Šiame pavyzdyje gavau kelis IP adresus, tačiau domina tik tas, kurį maršrutizatorius priskiria kompiuteriui, kuriame veikia programa: IP adresas, kurį norėčiau suteikti, jei jis nori pasiekti bendrinamą aplanką, pvz., mano kompiuteryje

Jei nesu prisijungęs prie tinklo, ir aš prisijungiu prie interneto tiesiogiai per modemą be maršrutizatoriaus, norėčiau gauti klaidos pranešimą. Kaip sužinoti, ar kompiuteris prijungtas prie C # tinklo, ir, jei taip, gauti LAN IP adresą.

216
23 июля '11 в 23:20 2011-07-23 23:20 Tono Nam yra nustatytas liepos 23 d. 11 val. 23:20 2011-07-23 23:20
ответ 21 atsakymas

Jei norite gauti vietinį IP adresą:

 public static string GetLocalIPAddress() { var host = Dns.GetHostEntry(Dns.GetHostName()); foreach (var ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { return ip.ToString(); } } throw new Exception("No network adapters with an IPv4 address in the system!"); } 

Jei norite patikrinti, ar esate prisijungę, ar ne:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

363
23 июля '11 в 23:26 2011-07-23 23:26 atsakymas pateikiamas „ mrchief“ liepos 23 d., 11 val. 23:26 2011-07-23 23:26

Tikslesnis būdas, kai vietiniame kompiuteryje yra keli IP adresai. Connect UDP lizdą ir perskaitykite jo vietinį parametrą:

 string localIP; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) { socket.Connect("8.8.8.8", 65530); IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; localIP = endPoint.Address.ToString(); } 
border=0

Connect prie UDP sulčių turi tokį efektą: jis nustato Send / Recv paskirties vietą, lašo visus paketus iš kitų adresų ir - tai, ką mes naudojame, siunčia lizdą į „prijungtą“ būseną, nustato atitinkamus laukus. Tai apima maršruto prieinamumo prie paskirties vietos patikrinimą pagal sistemos maršruto lentelę ir atitinkamai vietos vietos nustatymą. Pastaroji dalis atrodo oficialiai nepatvirtinta, tačiau atrodo, kad tai yra Berkeley lizdo API („prijungto“ UDP būsenos šalutinis poveikis), kuris patikimai veikia „Windows“ ir „Linux “ versijose ir platinimuose, bruožas.

Taigi šis metodas suteiks vietinį adresą, kuris bus naudojamas prisijungti prie nurodyto nuotolinio kompiuterio. Nėra ryšio, todėl nurodytas nuotolinis IP gali nebūti.

152
09 дек. p. Wang atsakymas iš „Next Door 09“. 2014-12-09 13:13 '14, 13:13 2014-12-09 13:13

„Mrcheif“ kodo atkūrimas, siekiant naudoti „Linq“ (t.y. „Net 3.0+“).

 private IPAddress LocalIPAddress() { if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { return null; } IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); return host .AddressList .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); } 

:)

99
22 авг. atsakymą pateikė „ Pure.Krome“ 22 rug . 2011-08-22 02:25 '11, 2:25 am 2011-08-22 02:25

Žinau, kad tai gali būti mirusio arklio kojos, bet gal tai galėtų padėti kažkas. Aš visur ieškojau vietinio IP adreso, bet visur, kur aš jį rasiu, jis sako, kad naudoja:

 Dns.GetHostEntry(Dns.GetHostName()); 

Man tai nepatinka, nes jis gauna visus jūsų kompiuteriui priskirtus adresus. Jei turite kelias tinklo sąsajas (kurios šiuo metu veikia visuose kompiuteriuose), nežinote, kuris adresas yra su kokia tinklo sąsaja. Kai atlikote tam tikrą tyrimą, sukūriau funkciją, kuri naudojo „NetworkInterface“ klasę ir ištraukė informaciją iš jos. Tokiu būdu galiu pasakyti, kuris sąsajos tipas yra („Ethernet“, belaidis ryšys, „loopback“, tunelis ir pan.), Ar jis yra aktyvus, ar ne, ir „SOOO“ yra daug daugiau.

 public string GetLocalIPv4(NetworkInterfaceType _type) { string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type  item.OperationalStatus == OperationalStatus.Up) { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { output = ip.Address.ToString(); } } } } return output; } 

Dabar, kad gautumėte „Ethernet“ tinklo sąsajos IPv4 adresą:

 GetLocalIPv4(NetworkInterfaceType.Ethernet); 

Arba belaidžio ryšio sąsaja:

 GetLocalIPv4(NetworkInterfaceType.Wireless80211); 

Jei bandysite gauti belaidžio ryšio sąsajai IPv4 adresą, tačiau jūsų kompiuteryje nėra įdiegta belaidė kortelė, ji tiesiog grąžins tuščią eilutę. Tas pats su Ethernet sąsaja.

Tikiuosi, kad tai padės kažkam!: -)

EDIT:

Pastebėta (dėka @NasBanov), kad nors ši funkcija yra daug geriau išgauti IP adresą, nei naudojant Dns.GetHostEntry(Dns.GetHostName()) , ji nepalaiko kelių tos pačios rūšies ar kelių IP sąsajų -adresas vienoje sąsajoje. Jis gali grąžinti tik vieną IP adresą, jei gali būti priskirti keli adresai. Norėdami grąžinti VISUS šiuos priskirtus adresus, galite tiesiog manipuliuoti šaltinio funkcija, kad visada grąžintumėte masyvą vietoj vienos eilutės. Pavyzdžiui:

 public static string[] GetAllLocalIPv4(NetworkInterfaceType _type) { List<string> ipAddrList = new List<string>(); foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type  item.OperationalStatus == OperationalStatus.Up) { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { ipAddrList.Add(ip.Address.ToString()); } } } } return ipAddrList.ToArray(); } 

Dabar ši funkcija grąžins VISI priskirtus adresus konkrečiam sąsajos tipui. Dabar, norint gauti tik vieną eilutę, galite naudoti „ .FirstOrDefault() plėtinį, kad grąžintumėte pirmąjį elementą masyve arba, jei jis yra tuščias, grąžinkite tuščią eilutę.

 GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault(); 
86
18 июля '14 в 0:41 2014-07-18 00:41 atsakymas pateikiamas compman2408, liepos 18 d., „14, 0:41 2014-07-18 00:41

Čia yra modifikuota versija (nuo compman2408 one), kuri dirbo man:

 internal static string GetLocalIPv4(NetworkInterfaceType _type) { string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { if (item.NetworkInterfaceType == _type  item.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties adapterProperties = item.GetIPProperties(); if (adapterProperties.GatewayAddresses.FirstOrDefault() != null) { foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses) { if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { output = ip.Address.ToString(); } } } } } return output; } 

Pakeisti: gaunu IP adresą iš adapterio, kuriam priskiriamas šliuzo IP adresas.

19
20 февр. Atsakymas duotas Gerardo H 20 vasario mėn. 2015-02-20 06:39 '15 at 6:39 2015-02-20 06:39

Tai geriausias kodas, kurį radau, kad galėčiau gauti dabartinį IP adresą, išvengiant VMWare kompiuterio ar kito negaliojančio IP adreso.

 public string GetLocalIpAddress() { UnicastIPAddressInformation mostSuitableIp = null; var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (var network in networkInterfaces) { if (network.OperationalStatus != OperationalStatus.Up) continue; var properties = network.GetIPProperties(); if (properties.GatewayAddresses.Count == 0) continue; foreach (var address in properties.UnicastAddresses) { if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue; if (IPAddress.IsLoopback(address.Address)) continue; if (!address.IsDnsEligible) { if (mostSuitableIp == null) mostSuitableIp = address; continue; } // The best IP is the IP got from DHCP server if (address.PrefixOrigin != PrefixOrigin.Dhcp) { if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible) mostSuitableIp = address; continue; } return address.Address.ToString(); } } return mostSuitableIp != null ? mostSuitableIp.Address.ToString() : ""; } 
14
10 нояб. atsakymas duotas rodcesar.santos lapkričio 10 d 2016-11-10 16:27 '16, 16:27 pm 2016-11-10 16:27

Manau, kad LinQ naudojimas yra paprastesnis:

 Dns.GetHostEntry(Dns.GetHostName()) .AddressList .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) .ToString() 
7
25 марта '14 в 20:23 2014-03-25 20:23 atsakymą Kapé pateikė kovo 25 d. 14 d. 20:23 2014-03-25 20:23

Juoktis, aš maniau, kad bandau gauti vieną LINQ operatorių, naudodamas naują operatorių su sąlyga C # 6. Ji atrodo gana beprotiška ir tikriausiai siaubingai neefektyvi, tačiau ji veikia.

 private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet) { // Bastardized from: http://stackoverflow.com/a/28621250/2685650. return NetworkInterface .GetAllNetworkInterfaces() .FirstOrDefault(ni => ni.NetworkInterfaceType == type  ni.OperationalStatus == OperationalStatus.Up  ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null  ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null ) ?.GetIPProperties() .UnicastAddresses .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) ?.Address ?.ToString() ?? string.Empty; } 

Loginis Gerardo H compman2408 (ir nuoroda compman2408 ).

4
10 февр. Atsakymas pateiktas Stajs vasario 10 d 2016-02-10 06:53 '16 at 6:53 AM 2016-02-10 06:53

@mrcheif Šį atsakymą suradau šiandien ir tai buvo labai naudinga, nors ji sugrįžo į neteisingą IP (ne todėl, kad kodas neveikė), bet jis suteikė neteisingą IP adresą, jei turite tokių dalykų kaip Himachi .

 public static string localIPAddress() { IPHostEntry host; string localIP = ""; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { localIP = ip.ToString(); string[] temp = localIP.Split('.'); if (ip.AddressFamily == AddressFamily.InterNetwork  temp[0] == "192") { break; } else { localIP = null; } } return localIP; } 
4
23 нояб. Atsakymą pateikė Jordan Trainor lapkričio 23 d. 2012-11-23 19:53 '12 19:53 val. 2012-11-23 19:53

Kitas būdas gauti IP yra su linq išraiška:

 public static List<string> GetAllLocalIPv4(NetworkInterfaceType type) { return NetworkInterface.GetAllNetworkInterfaces() .Where(x => x.NetworkInterfaceType == type  x.OperationalStatus == OperationalStatus.Up) .SelectMany(x => x.GetIPProperties().UnicastAddresses) .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork) .Select(x => x.Address.ToString()) .ToList(); } 
2
28 мая '17 в 14:31 2017-05-28 14:31 atsakymas pateikiamas Amirhossein Yari gegužės 28 d., 17 val. 14:31

Būtinos sąlygos: turite pridėti System.Data.Linq nuorodą ir nurodyti ją.

 using System.Linq; string ipAddress =""; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork)); 
2
17 мая '16 в 13:26 2016-05-17 13:26 atsakymas pateikiamas „ Pola“ gegužės 17 d., 16 val., 16:26, 2016-05-17 13:26

Aš taip pat kovojau su teise gauti teisingą IP.

Čia bandžiau įvairius sprendimus, bet niekas man nedavė norimo poveikio. Beveik visi pateikti sąlyginiai testai nesukėlė adreso naudojimo.

Būtent tai dirbo man, tikiuosi, kad tai padės ...

 var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address) where !IPAddress.IsLoopback(address)  address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork select address).FirstOrDefault(); Console.WriteLine(firstAddress); 
1
05 июня '18 в 21:12 2018-06-05 21:12 atsakymas pateikiamas UberBiza birželio 05-18 d. 21:12 2018-06-05 21:12

Atnaujindami Mrchief atsakymą su „Linq“, turėsime:

 public static IPAddress GetLocalIPAddress() { var host = Dns.GetHostEntry(Dns.GetHostName()); var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); return ipAddress; } 
1
26 февр. atsakymą pateikė Ashkan Sirous 26 vasaris. 2018-02-26 11:39 '18, 11:39

Tik atnaujinta mano versijos versija naudojant LINQ:

 /// <summary> /// Gets the local Ipv4. /// </summary> /// <returns>The local Ipv4.</returns> /// <param name="networkInterfaceType">Network interface type.</param> IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType) { var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType  i.OperationalStatus == OperationalStatus.Up); foreach (var networkInterface in networkInterfaces) { var adapterProperties = networkInterface.GetIPProperties(); if (adapterProperties.GatewayAddresses.FirstOrDefault() == null) continue; foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily != AddressFamily.InterNetwork) continue; return ip.Address; } } return null; } 
1
21 сент. Giusepe atsakymas 21 rugsėjo 2015-09-21 21:31 '15 - 21:31 2015-09-21 21:31

Pasenęs, jis veikia man

 public static IPAddress GetIPAddress() { IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First(); return ip; } 
1
23 дек. Atsakymas Sourcephy 23 d. 2017-12-23 04:16 '17 at 4:16 2017-12-23 04:16

Atminkite, kad apskritai galite atlikti kelis NAT vertimus ir kelis DNS serverius, kurių kiekvienas veikia skirtingais NAT vertimo lygiais.

Ką daryti, jei turite NAT operatorių ir norite bendrauti su kitais to paties operatoriaus klientais? Apskritai, jūs niekada nežinote, nes galite rodyti su skirtingais kompiuterio pavadinimais su kiekvienu NAT vertimu.

1
01 июля '15 в 14:25 2015-07-01 14:25 atsakymas pateikiamas sgjsfth sthseth liepos 1 d. 15, 14:25 2015-07-01 14:25
 string str=""; System.Net.Dns.GetHostName(); IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(str); IPAddress[] addr = ipEntry.AddressList; string IP="Your Ip Address Is :->"+ addr[addr.Length - 1].ToString(); 
1
23 июня '14 в 7:56 2014-06-23 07:56 atsakymą pateikė Naimish Mungara , birželio 23 d. 14 d., 07:56, 2014-06-23 07:56
 Dns.GetHostEntry(Dns.GetHostName()).AddressList[1] 

viena eilutės eilutė: D

0
19 февр. Fuzzybear atsakymas 19 vasario mėn 2014-02-19 18:27 '14 at 18:27 2014-02-19 18:27

Išbandyta su viena ar daugiau LAN kortelių ir virtualių mašinų

 public static string DisplayIPAddresses() { string returnAddress = String.Empty; // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface network in networkInterfaces) { // Read the IP configuration for each network IPInterfaceProperties properties = network.GetIPProperties(); if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet  network.OperationalStatus == OperationalStatus.Up  !network.Description.ToLower().Contains("virtual")  !network.Description.ToLower().Contains("pseudo")) { // Each network interface may have multiple IP addresses foreach (IPAddressInformation address in properties.UnicastAddresses) { // We're only interested in IPv4 addresses for now if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue; // Ignore loopback addresses (eg, 127.0.0.1) if (IPAddress.IsLoopback(address.Address)) continue; returnAddress = address.Address.ToString(); Console.WriteLine(address.Address.ToString() + " (" + network.Name + " - " + network.Description + ")"); } } } return returnAddress; } 
0
05 окт. Shanewaj 05 okt. 2018-10-05 08:05 '18, 8:05

Jei turite virtualių mašinų ar papildomų tinklo kortelių, adresų sąraše gali būti kitų reikšmių. Mano pasiūlymas yra patikrinti adresų sąrašą ir spausdinti įrašus, kurie atitinka. Mano atveju, 3 įrašas buvo mano mašinos IPv4 adresas.

 IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddr = ipHost.AddressList[3]; string ip = ipAddr.ToString(); 

Nepamirškite pridėti using System.Net;

-3
14 нояб. Atsakymą pateikė Bibaswann Bandyopadhyay 14 nov. 2014-11-14 22:40 '14, 22:40 2014-11-14 22:40

Čia yra visiškai funkcionalus ir patikimas 1 linijinis vidinis IP adresas. Pagaminta lygiagrečiai vykdant kalbą Dyalog APL. Įdomu tai, kad ši maža kodo dalis palaiko 0, 1 arba kelis IPv4 adapterius - rezultatas yra tik masyvas, kurio ilgis yra 0, 1 arba n įterptųjų tekstų vektoriai.

Iš esmės dėl jūsų painiavos manau: -)

 #.Dns.(a.AddressFamily.(⎕THIS=InterNetwork)/a←(GetHostEntry GetHostName).AddressList).ToString 

Grąžina (šiam kompiuteriui): 192.168.0.100 (<- atskiras vektorinis blokas, kurio pirmasis elementas yra vektorius su 13 simbolių)

-8
14 марта '16 в 1:37 2016-03-14 01:37 atsakymas pateikiamas „ Stormwind“ kovo 14 d., 16 val. 1:37 2016-03-14 01:37

Kiti klausimai apie žymes arba Užduoti klausimą