2008-09-29 14 views
24

मुझे सी # और .NET 3.5 का उपयोग कर अपने प्रोग्राम से कंप्यूटर के वास्तविक स्थानीय नेटवर्क आईपी पते (उदाहरण के लिए 192.168.0.220) प्राप्त करने की आवश्यकता है। मैं इस मामले में 127.0.0.1 का उपयोग नहीं कर सकता।मैं प्रोग्राम के कंप्यूटर के स्थानीय नेटवर्क आईपी पते को कैसे प्राप्त करूं? (सी #)

ऐसा करने का सबसे अच्छा तरीका क्या है? एक मशीन एकाधिक आईपी पतों आपके आईपी पते कि आप करने जा रहे हैं यह पता लगाने का सही तरीका हो सकता है के रूप में,

उत्तर

25

Link यह वहाँ का कहना है, System.net जोड़ने के लिए, और का उपयोग कर निम्नलिखित

//To get the local IP address 
string sHostName = Dns.GetHostName(); 
IPHostEntry ipE = Dns.GetHostByName (sHostName); 
IPAddress [] IpA = ipE.AddressList; 
for (int i = 0; i < IpA.Length; i++) 
{ 
    Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString()); 
} 
+0

आपके द्वारा वापस आने वाले सरणी में कौन सा आईपी पता सही है? – EBGreen

+6

GetHostByName बहिष्कृत के रूप में दिखा रहा है। घायल होकर उपयोग करें: आईपीएड्रेस [] ipAddress = Dns.GetHostAddresses (strHostName); एक ही चीज़ को पूरा करता है। –

+12

इसके अलावा, इस बिंदु पर हंगेरियन नोटेशन लगभग मर चुका है। स्ट्रिंग होस्टनाम का प्रयोग करें। –

11

सामान्य इंटरनेट के मार्ग के लिए उपयोग करना इंटरनेट पर एक मेजबान को सॉकेट खोलना है, फिर सॉकेट कनेक्शन का निरीक्षण करें ताकि यह पता चल सके कि उस कनेक्शन में स्थानीय पता क्या उपयोग किया जा रहा है।

सॉकेट कनेक्शन का निरीक्षण करके, आप अजीब रूटिंग टेबल, एकाधिक आईपी पते और चौंकाने वाले होस्टनामों को ध्यान में रख पाएंगे। उपरोक्त होस्टनाम के साथ चाल काम कर सकती है, लेकिन मैं इसे पूरी तरह से विश्वसनीय नहीं मानूंगा।

36

आप देख रहे हैं जानकारी है कि कमांड लाइन उपयोगिता, ipconfig, प्रदान कर सकते हैं की तरह के लिए, तो आप शायद System.Net.NetworkInformation नाम स्थान का उपयोग कर किया जाना चाहिए।

यह नमूना कोड सभी नेटवर्क इंटरफेस का आकलन करेगा और प्रत्येक एडाप्टर के लिए ज्ञात पते को डंप करेगा।

using System; 
using System.Net; 
using System.Net.NetworkInformation; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      Console.WriteLine("Network Interface: {0}", netif.Name); 
      IPInterfaceProperties properties = netif.GetIPProperties(); 
      foreach (IPAddress dns in properties.DnsAddresses) 
       Console.WriteLine("\tDNS: {0}", dns); 
      foreach (IPAddressInformation anycast in properties.AnycastAddresses) 
       Console.WriteLine("\tAnyCast: {0}", anycast.Address); 
      foreach (IPAddressInformation multicast in properties.MulticastAddresses) 
       Console.WriteLine("\tMultiCast: {0}", multicast.Address); 
      foreach (IPAddressInformation unicast in properties.UnicastAddresses) 
       Console.WriteLine("\tUniCast: {0}", unicast.Address); 
     } 
    } 
} 

शायद आप यूनिकास्ट एड्रेस में सबसे अधिक रुचि रखते हैं।

24

DNS का उपयोग की आवश्यकता है कि आपके कंप्यूटर स्थानीय DNS सर्वर है, जो जरूरी सच नहीं है अगर आप एक इंट्रानेट पर कर रहे हैं के साथ पंजीकृत होना, और यहां तक ​​कि कम संभावना है अगर आप एक आईएसपी के साथ घर पर कर रहे हैं। इसे नेटवर्क राउंडट्रिप की भी आवश्यकता होती है - सभी अपने कंप्यूटर के बारे में जानकारी प्राप्त करने के लिए।

उचित तरीके:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
foreach(NetworkInterface adapter in nics) 
{ 
    foreach(var x in adapter.GetIPProperties().UnicastAddresses) 
    { 
     if (x.Address.AddressFamily == AddressFamily.InterNetwork && x.IsDnsEligible) 
     { 
        Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString()); 
     } 
    } 
} 

NetworkInterface.GetAllNetworkInterfaces() 
    .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses) 
    .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible) 
    .Select (adr => adr.Address.ToString()); 
:

या जो सिर्फ Linq की एक पंक्ति की तरह उन लोगों के लिए (अद्यतन 31 जुलाई 2015 के कोड के साथ कुछ समस्या फिक्स्ड)

+0

हे जेम्स, हे 'नेटवर्क इन्फॉर्मेशन' आपके उत्तर रेखा संख्या 2: 2, सी # कंपाइलर कह रहा है "टाइप या नेमस्पेस नहीं मिला", मैंने पहले ही 'System.Net.NetworkInformation' आयात किया है, फिर भी यह कह रहा है "टाइप या नेमस्पेस गुम है" , क्या बात है ? – FosterZ

+1

@ फोस्टरज़: मैं सहमत हूं (यह इस तरह काम नहीं करता है)। मैंने इस कोड को इस प्रकार कार्यान्वित किया: 'foreach (nics में NetworkInterface ni) {foreach (UnicastIPAddressInformation x ni.GetIPProperties()। UnicastAddresses) {if (x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) {कंसोल .WriteLine ("IPAddress ........: {0: x}", x.Address.ToString()); }}} 'और यह मेरे अधिकांश वास्तविक आईपी पते और कुछ अन्य गैर-आईपी-पते के मिश्रण को मुद्रित करता है। – user664939

1

यदि आप जानते हैं कि आपके कंप्यूटर के लिए एक या अधिक आईपीवी 4 पते हैं, तो यह उनमें से एक प्रदान करेगा:

Dns.GetHostAddresses(Dns.GetHostName()) 
    .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString() 

GetHostAddresses सामान्य रूप से कॉलिंग थ्रेड को अवरुद्ध करता है जबकि यह DNS सर्वर से पूछताछ करता है, और क्वेरी विफल होने पर SocketException फेंकता है। मुझे नहीं पता कि यह आपके स्वयं के होस्ट नाम को देखते समय नेटवर्क कॉल को छोड़ देता है या नहीं।

संबंधित मुद्दे

 संबंधित मुद्दे