स्थानीय आईपी पता प्राप्त करें


301

इंटरनेट में कई जगह हैं जो आपको दिखाती हैं कि आईपी एड्रेस कैसे प्राप्त करें। और उनमें से कई इस तरह दिखते हैं:

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

इस उदाहरण के साथ मुझे कई आईपी पते मिलते हैं, लेकिन मुझे केवल उसी को प्राप्त करने में दिलचस्पी है जो राउटर प्रोग्राम चलाने वाले कंप्यूटर को असाइन करता है: वह आईपी जिसे मैं किसी को देना चाहूंगा यदि वह मेरे कंप्यूटर में साझा फ़ोल्डर तक पहुंचना चाहता है उदाहरण।

अगर मैं एक नेटवर्क से जुड़ा नहीं हूं और मैं बिना राउटर वाले मॉडेम के जरिए सीधे इंटरनेट से जुड़ा हूं तो मैं एक त्रुटि प्राप्त करना चाहूंगा। मैं यह कैसे देख सकता हूं कि मेरा कंप्यूटर C # के साथ नेटवर्क से जुड़ा हुआ है या नहीं और यदि यह है तो LAN IP पता प्राप्त करने के लिए।


If I am not connected to a network and I am connected to the internet यह कथन विरोधाभासी लगता है। क्या आप यह पता लगाने की कोशिश कर रहे हैं कि क्या आपका कंप्यूटर एक निजी LAN या इंटरनेट से जुड़ा है?
एंडी

4
बस एक चेतावनी के रूप में: एक कंप्यूटर में एक से अधिक आईपी इंटरफ़ेस हो सकते हैं, उदाहरण के लिए एक लैन और वाईफाई। यदि आप किसी सेवा को हार्डवेयर के किसी विशेष टुकड़े (LAN को) कहते हैं, तो आपको LAN की IP की आवश्यकता होती है। निम्नलिखित उदाहरणों में से अधिकांश "पहले" या "अंतिम" आईपी पते को वापस कर देंगे। यदि आपके पास 2 से अधिक आईपी पते हैं, तो आपका प्रोग्राम 50% समय के लिए काम कर सकता है, यह इस बात पर निर्भर करता है कि ओएस किस क्रम पर आईपी पते लौटाता है।
निशान लता

@MarkLakata मैंने इसी मुद्दे पर सोचा था। नीचे मेरे जवाब में कार्य यह संभाल लेंगे। आप निर्दिष्ट कर सकते हैं कि आप किस प्रकार के नेटवर्क इंटरफ़ेस से आईपी एड्रेस चाहते हैं।
compman2408

3
जस्ट एफटीआर, अगर आप यहां यूनिटी 3 डी के लिए गूगल करते हैं, तो यह उनके API में Network.player.ipAddress है
Fattie

@MarkLakata कडाई के साथ "पहले" या "पिछले" आईपी है "सही" आईपी, जैसा कि ब्राउज़र किसी भी IP कि उपलब्ध है का उपयोग कर सकते हैं। मशीन से जुड़े प्रत्येक आईपी को वापस करने के लिए एक अच्छा सुधार होना चाहिए ।
UnAAlby

जवाबों:


457

स्थानीय आईपी पता प्राप्त करने के लिए:

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!");
}

यह जांचने के लिए कि क्या आप कनेक्ट हैं या नहीं:

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


29
अगर आप vm virtual box, genymotion इत्यादि जैसे सामान का उपयोग नहीं करते हैं, तो
PauLEffect

5
पॉलफैक्ट से सहमत हैं। न केवल यह विधि कई नेटवर्क कार्ड के लिए खराब है, बल्कि, यह आईपी वी 6 और आईपी वी 4 पतों के बीच अंतर नहीं कर रहा है।
मैक्स

16
@John AddressFamily.InterNetwork IP v4 और AddressFamily.InterNetworkV6 IP v6 है
लियोनार्डो जेवियर

मैं गेराल्डो एच उत्तर का उपयोग कर रहा हूं, लेकिन अगर कोई भी इसका उपयोग कर रहा है, तो आप 1 के साथ समाप्त होने वाले सभी ips को हटा सकते हैं, इसलिए यह लूपबैक और वर्चुअलबॉक्स / vmware डिफ़ॉल्ट ips को हटा देगा
लियोनार्डो ज़ेवियर

6
ऐसा लगता है कि आप VMWare या अन्य वर्चुअलाइजेशन सॉफ़्टवेयर का उपयोग कर रहे हैं। ओपी ने यह नहीं पूछा, इसलिए मुझे लगता है कि इसके कारण मतदान थोड़ा कठोर है। यदि आपके पास VMWare या कई एनआईसी हैं, तो कुछ अन्य उत्तर पहले से ही उस पर सुराग प्रदान करते हैं।
मृकफ

218

स्थानीय मशीन पर मल्टी आईपी एड्रेस उपलब्ध होने पर अधिक सटीक तरीका है। ConnectUDP सॉकेट और उसका स्थानीय समापन बिंदु पढ़ें:

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

ConnectUDP सॉकेट पर निम्न प्रभाव पड़ता है: यह Send/ के लिए गंतव्य सेट करता है Recv, अन्य पतों से सभी पैकेटों को अलग करता है, और - जो हम उपयोग करते हैं - सॉकेट को "कनेक्टेड" स्थिति में स्थानांतरित करता है, उसके उपयुक्त क्षेत्रों को सेट करता है। इसमें सिस्टम के रूटिंग टेबल के अनुसार गंतव्य के मार्ग के अस्तित्व की जांच करना और उसके अनुसार स्थानीय समापन बिंदु सेट करना शामिल है। अंतिम भाग को आधिकारिक रूप से अप्रत्यक्ष रूप से लगता है, लेकिन यह बर्कले सॉकेट्स एपीआई (यूडीपी "कनेक्टेड" राज्य का एक साइड इफेक्ट) का एक अभिन्न लक्षण जैसा दिखता है, जो संस्करणों और वितरणों में विंडोज और लिनक्स दोनों में मज़बूती से काम करता है ।

इसलिए, यह विधि स्थानीय पते को देगी जिसका उपयोग निर्दिष्ट दूरस्थ होस्ट से कनेक्ट करने के लिए किया जाएगा। कोई वास्तविक कनेक्शन स्थापित नहीं है, इसलिए निर्दिष्ट दूरस्थ आईपी पहुंच से बाहर हो सकता है।


4
यह सबसे अच्छा समाधान है जिसने मेरी जरूरतों के लिए काम किया है। मेरी स्थिति में मेरे पास कई नेटवर्क कार्ड और कुछ वायरलेस कनेक्शन हैं। मुझे पसंदीदा आईपी पता प्राप्त करने की आवश्यकता थी जिसके आधार पर कनेक्शन सक्रिय किया गया था।
डेविड

10
नेटवर्क कनेक्शन के बिना - आपके पास कोई आईपी पता नहीं है, किसी भी तरह। इसलिए, कोड अभी भी मान्य है, हालांकि इस तरह की स्थिति को संभालने के लिए एक प्रयास..चेक जोड़ने के लिए विवेकपूर्ण होगा, और एक सॉकेटएक्सैप्शन को फेंकने पर "127.0.0.1" जैसे कुछ वापस करना होगा।
रस

2
@PatrickSteele, हां, यह विशिष्ट लक्ष्य के लिए पसंदीदा आउटबाउंड आईपी पता देता है। यदि आप अपना लैन आईपी पता प्राप्त करना चाहते हैं, तो अपने लैन से कुछ आईपी होने के लक्ष्य को इंगित करने का प्रयास करें
Mr.Wang अगले दरवाजे से

2
यह विधि डॉटनेट कोर के साथ एक मैक पर काम करती है, जबकि स्वीकृत उत्तर वर्तमान में नहीं है।
पेलेट

9
यह समाधान स्वीकृत उत्तर (श्रीकिफ द्वारा) की तुलना में लगभग 4 गुना तेज काम करता है। इसका वास्तविक उत्तर होना चाहिए
कामारेई

115

Linche (यानी .Net 3.0+) का लाभ उठाने के लिए Mrcheif के कोड को फिर से दिखाना। ।

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

:)


मुझे "इंटर नेटवर्क" के रूप में कुछ आईपी पते मिले हैं यह समाधान वास्तव में काम करता है और सही को वापस देता है। मृचफ से एक अन्य बस मुझे आखिरी देता है। तो वास्तव में यह एक सही होना चाहिए;)
किन्नोरा फ्लफबॉल

26
@ कीनोराफ्लफबॉल - यह एक आपको पहले देता है, जबकि यह आपको अंतिम एक देता है (या इसके विपरीत, निर्भर करता है कि सूची का निर्माण कैसे किया जाता है)। किसी भी तरह से, न तो सही है - यदि आपके द्वारा दिए गए 1 से अधिक आईपी पते हैं, तो आपको यह जानना होगा कि आप किस नेटवर्क का उपयोग कर रहे हैं। पहले या आखिरी लेने से अनुमान सही समाधान नहीं है।
gbjbaanb

मई को AddressFamily.InterNetworkV6
joelsand

यदि नेटवर्क उपलब्ध नहीं है, तो अशक्त की वापसी उपयोगी नहीं है यदि आपको स्टैंडअलोन पीसी को भी संभालना है। मैंने इसे "रिटर्न IPAddress.Loopback;" से बदल दिया। जो विशेष IP संख्या 127.0.0.1 से मेल खाती है।
क्रिश्चियन

109

मुझे पता है कि यह एक मरे हुए घोड़े को मार सकता है, लेकिन शायद यह किसी की मदद कर सकता है। मैंने अपने स्थानीय आईपी पते को खोजने के लिए सभी जगह देखा है, लेकिन हर जगह मुझे लगता है कि इसका उपयोग करने के लिए कहा गया है:

Dns.GetHostEntry(Dns.GetHostName());

मुझे यह बिल्कुल पसंद नहीं है क्योंकि यह सिर्फ आपके कंप्यूटर को दिए गए सभी पते प्राप्त करता है। यदि आपके पास कई नेटवर्क इंटरफेस हैं (जो बहुत सारे कंप्यूटर अब-ए-दिन करते हैं) तो आपको पता नहीं है कि कौन सा पता किस नेटवर्क इंटरफ़ेस के साथ जाता है। अनुसंधान का एक गुच्छा करने के बाद मैंने NetworkInterface क्लास का उपयोग करने के लिए एक फ़ंक्शन बनाया और उसमें से जानकारी को बाहर निकाला। इस तरह से मैं बता सकता हूं कि यह किस प्रकार का इंटरफ़ेस है (ईथरनेट, वायरलेस, लूपबैक, टनल, आदि), यह सक्रिय है या नहीं, और SOOO और भी बहुत कुछ।

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;
}

अब अपने ईथरनेट नेटवर्क इंटरफेस कॉल का IPv4 पता पाने के लिए:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

या आपका वायरलेस इंटरफ़ेस:

GetLocalIPv4(NetworkInterfaceType.Wireless80211);

यदि आप वायरलेस इंटरफ़ेस के लिए IPv4 पता प्राप्त करने का प्रयास करते हैं, लेकिन आपके कंप्यूटर में वायरलेस कार्ड स्थापित नहीं है, तो यह केवल एक खाली स्ट्रिंग लौटाएगा। ईथरनेट इंटरफेस के साथ एक ही बात।

आशा है कि यह किसी की मदद करता है! :-)

संपादित करें:

यह इंगित किया गया था (धन्यवाद @NasBanov) कि भले ही यह फ़ंक्शन आईपी पते को बहुत बेहतर तरीके से निकालने के बारे में हो, Dns.GetHostEntry(Dns.GetHostName())लेकिन इसका उपयोग करने से एक ही प्रकार के कई इंटरफेस या एक ही इंटरफ़ेस पर कई आईपी पते का समर्थन करने में बहुत अच्छा नहीं होता है । यह केवल एक ही IP पता लौटाएगा जब कई पते असाइन किए जा सकते हैं। इन सभी असाइन किए गए पतों को वापस करने के लिए आप मूल फ़ंक्शन में हेरफेर कर सकते हैं ताकि एक स्ट्रिंग के बजाय हमेशा एक सरणी लौटा सकें। उदाहरण के लिए:

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

अब यह फ़ंक्शन विशिष्ट इंटरफ़ेस प्रकार के लिए सभी असाइन किए गए पते वापस कर देगा। अब केवल एक स्ट्रिंग प्राप्त करने के लिए, आप .FirstOrDefault()एरे में पहला आइटम वापस करने के लिए एक्सटेंशन का उपयोग कर सकते हैं या यदि यह खाली है, तो एक खाली स्ट्रिंग लौटाएं।

GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();

5
यह एक बेहतर समाधान है क्योंकि बहुत सारे स्थानों में DNS प्रयोज्य नहीं है और इंटरफेस में कई आईपी पते हो सकते हैं। मैं भी एक समान विधि का उपयोग करता हूं।
मर्ट गुल्सोइ

इसके साथ मुद्दा यह है कि आप केवल प्रति इंटरफ़ेस 1 आईपी पते को वापस करते हैं ... अंतिम आईपी, फ़ॉरच।
नास बानोव

@ compman2408 - सच नहीं है, एक एकल इंटरफ़ेस में कई आईपी हो सकते हैं, सभी कॉम्बो के लिए en.wikipedia.org/wiki/Multihoming#Variants देखें । स्पष्ट उदाहरण IPv4 और IPv6 दोनों को चलाने के दौरान है, लेकिन अतीत में मेरे पास एकल ईथरनेट एडेप्टर कई IPP4 नेटवर्क में भाग लेते हैं। असामान्य हो सकता है - अभी तक पूरी तरह से कानूनी। जैसे Windows के लिए windowsnetworking.com/articles-tutorials/windows-2003/…
Nas Banov

@NasBanov यह फ़ंक्शन केवल IPv4 पते प्राप्त करने के लिए सेट किया गया है, इसलिए मैं IPv6 और इसकी वर्तमान बेकारता के बारे में बात करने वाला नहीं हूं। मैं कई इंटरफेस पर कई नेटवर्क से कनेक्ट करने के रूप में मल्टीहोमिंग के बारे में जानता हूं, हालांकि एक ही इंटरफेस पर कई नेटवर्क से कनेक्ट होने के बारे में कभी नहीं सुना है। भले ही ऐसा लगता है कि आप सही हैं कि यह वास्तव में संभव है, अपने एनआईसी का उपयोग करने वाले <1% लोग इस तरह से केवल एक सरणी वापस करने के लिए फ़ंक्शन को बदलना होगा।
compman2408

1
इसके लिए शुक्रिया। FYI करें, OSX पर .NET 3.5 मोनो पर कम से कम item.OperationalStatusहमेशा लौटता है Unknown
GMAN

36

यहाँ एक संशोधित संस्करण है (compman2408 के एक से) जिसने मेरे लिए काम किया:

    internal static string GetLocalIPv4(NetworkInterfaceType _type)
    {  // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
        string output = "";  // default output
        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
        {  // Find the network interface which has been provided in the arguments, break the loop if found
            if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
            {   // Fetch the properties of this adapter
                IPInterfaceProperties adapterProperties = item.GetIPProperties();
                // Check if the gateway adress exist, if not its most likley a virtual network or smth
                if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
                {   // Iterate over each available unicast adresses
                    foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
                    {   // If the IP is a local IPv4 adress
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {   // we got a match!
                            output = ip.Address.ToString();
                            break;  // break the loop!!
                        }
                    }
                }
            }
            // Check if we got a result if so break this method
            if (output != "") { break; }
        }
        // Return results
        return output;
    }

आप इस विधि को उदाहरण के लिए कह सकते हैं:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

परिवर्तन: मैं एक एडेप्टर से आईपी को पुनः प्राप्त कर रहा हूं जिसमें एक गेटवे आईपी है जिसे इसे सौंपा गया है। दूसरा बदलाव: मैंने इस विधि को और अधिक कुशल बनाने के लिए डॉकस्ट्रिंग्स और ब्रेक स्टेटमेंट को जोड़ा है।


2
चतुर समाधान। मैं अब इसका उपयोग कर रहा हूं।
RQDQ

4
एक ही समस्या है जैसे कि यह जिस कोड से व्युत्पन्न किया गया था: यह सिर्फ आईपी में से एक को लौटाता है, कई में से एक यादृच्छिक आईपी - जिसकी आपको आवश्यकता नहीं है। यह Ademiller.com/blogs/tech/2008/06/it-works-on-my-machine-award
Nas Banov

1
@NasBanov, ज़रूर मैंने इसे कमाया, जैसा कि मैं अपनी पोस्ट में बता रहा हूं: "जो मेरे लिए काम करता है"। :-)
गेरार्डो एच।

यह जाने का रास्ता है, इसके लिए धन्यवाद। जब आपके पास इम्यूलेटर स्थापित करने के लिए लूप बैक स्विच होता है, तो यह सफल होने के दौरान अन्य सभी वेरिएंट विफल हो जाते हैं!
डायमंडड्रेक 16

1
आप केवल अपने द्वारा पाया गया अंतिम आईपी-पता ही क्यों लौटाते हैं, पहला नहीं? breakसबसे भीतरी में एक simpel ifया returnचाल होगा।
मार्टिन मुल्डर

20

यह सबसे अच्छा कोड है जिसे मैंने वर्तमान आईपी प्राप्त करने के लिए पाया है, VMWare होस्ट या अन्य अमान्य आईपी पते से बचने के लिए।

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()
        : "";
}

आपको शायद यह स्पष्ट करना चाहिए कि यह कोड उत्तर के लिए समाधान क्यों है। क्या आप वास्तव में इस सवाल का जवाब पा सकते हैं कि क्या आप इंटरनेट से जुड़े हैं और इसका परिणाम क्या होता है?
फिलिप एम

अन्य तरीके IsDnsEl योग्य और PrefixOrigin सत्यापन का उपयोग नहीं करते हैं।
छड़सर.संतोस

@PhilippM यदि पता DNS योग्य नहीं है, तो यह एक आरक्षित आंतरिक IP है। यह इंटरनेट प्रदाता होस्ट नहीं है। और अगर PrefixOrigin एक DHCP सर्वर द्वारा लागू किया गया था, संभव है कि यह सबसे अच्छा पता विकल्प है। यह अद्वितीय कार्य है जो मेरे लिए काम करता है!
छड़सार.संतोस 11

1
@ user1551843 - यह बहुत अच्छा था, धन्यवाद। मैं पुराने मूल्यह्रास GetHostByName विधि का उपयोग कर रहा था, लेकिन यह एक VMWare अडैप्टर का IP लौटा रहा था :)
जेसन न्यूलैंड

यह एकमात्र समाधान था जो मेरे लिए vpn + वायरलेस पर काम करता था। धन्यवाद।
जय-खतरे 21

12

मुझे लगता है कि LinQ का उपयोग करना आसान है:

Dns.GetHostEntry(Dns.GetHostName())
   .AddressList
   .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   .ToString()

14
यह LINQ नहीं है, यह विस्तार के तरीके और लंबोदा है। एक अंतर है।
मार्क

10
@ मर्क - यदि आप "System.Linq का उपयोग करके" नहीं जोड़ते हैं; हालांकि आप "प्रथम" एक्सटेंशन विधि का उपयोग नहीं कर सकते हैं
बोर्नटोड

5
ऐसा इसलिए है क्योंकि विस्तार विधि Enumerable वर्ग में है जो System.Linq नाम स्थान पर है। यह अभी भी LINQ नहीं है।
मार्क

20
मार्क, इस संक्षिप्त रूप में भी, कथन वास्तव में विधि (लैम्ब्डा) सिंटैक्स के साथ प्रस्तुत लाइनक्यू-टू-ऑब्जेक्ट का उपयोग कर रहा है। क्वेरी सिंटैक्स केवल सिंथैटिक चीनी है जिसे IEnumerable एक्सटेंशन मेथड कॉल्स की एक श्रृंखला के लिए संकलित किया जाता है, जो कि LINQ-to-Objects है। स्रोत: एक LINQ-to-SQL प्रदाता और इस विषय पर लेखों की एक श्रृंखला के लेखक हैं।
g


9

एक हंसी के लिए, मैंने सोचा था कि मैं नया C # 6 नल-सशर्त ऑपरेटर का उपयोग करके एक LINQ कथन प्राप्त करूंगा। बहुत पागल लगता है और शायद बहुत ही अक्षम है, लेकिन यह काम करता है।

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;
}

Gerardo H(और संदर्भ द्वारा compman2408) के सौजन्य से तर्क ।


निश्चित रूप से मजेदार (+1), लेकिन वास्तव में बिल्कुल भी अक्षम होने की आवश्यकता नहीं है। LISP या फोर्थ में प्रोग्रामिंग की याद दिलाता है :-)
रोलैंड

6

लाइनक अभिव्यक्ति का उपयोग करके आईपी प्राप्त करने का अन्य तरीका:

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

5

@mrcheif मुझे आज यह जवाब मिला और यह बहुत उपयोगी था, हालांकि इसने एक गलत आईपी लौटाया (कोड काम नहीं करने के कारण नहीं) लेकिन इसने गलत इंटरनेटवर्क आईपी दिया जब आपके पास हिमाचली जैसी चीजें हैं।

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;
}

2
क्या आपका मतलब है Logmein Hamachi? यह एक वीपीएन समाधान है और यह नेटवर्क स्टैक के साथ टिंकर करता है। साथ ही, एक वीपीएन होने के नाते, यह उचित लगता है कि कनेक्ट होने पर (केवल मेरा अनुमान) होने पर यह वीपीएन को सौंपा गया आईपी लौटा देता है।
मृकफिन २ Mr

2
पूरी तरह से अविश्वसनीय। न केवल 192.0.0.0/8एक निजी आईपी पते के लिए एक सही परीक्षण नहीं है (3 रेंज हैं, यह सब एक से अलग है), यह अच्छी तरह से एक कॉर्पोरेट नेटवर्क रेंज हो सकता है, इसलिए "स्थानीय" इतना नहीं।
ivan_pozdeev

5

एक या कई लैन कार्ड और वर्चुअल मशीन के साथ परीक्षण किया गया

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 (e.g., 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;
    }

ध्यान रखें कि यह केवल ईथरनेट के लिए काम कर रहा है। वाई-फाई का समर्थन करने के लिए NetworkInterfaceType प्रतिबंध निकालें।
19

3

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;
}

2

पूर्व आवश्यकताएं: आपको System.Data.Linq संदर्भ जोड़ना होगा और इसे संदर्भित करना होगा

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

2

मैं सही आईपी प्राप्त करने से भी जूझ रहा था।

मैंने यहां कई तरह के समाधानों की कोशिश की, लेकिन किसी ने मुझे वांछित प्रभाव नहीं दिया। लगभग सभी सशर्त परीक्षण जो प्रदान किए गए थे उनका कोई पता नहीं था।

यह मेरे लिए काम किया है, आशा है कि यह मदद करता है ...

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

str हमेशा खाली होता है
aj.toulan

1

ध्यान रखें, सामान्य स्थिति में आपके पास कई NAT अनुवाद हो सकते हैं, और कई dns सर्वर हो सकते हैं, प्रत्येक अलग NAT अनुवाद स्तर पर काम कर रहे हैं।

क्या होगा यदि आपके पास वाहक ग्रेड NAT है, और उसी वाहक के अन्य ग्राहकों के साथ संवाद करना चाहते हैं? सामान्य स्थिति में आप निश्चित रूप से कभी नहीं जानते हैं क्योंकि आप प्रत्येक NAT अनुवाद में विभिन्न होस्ट नामों के साथ दिखाई दे सकते हैं।


1

अप्रचलित हो गया, यह मेरे लिए काम करता है

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}

1

लिन्क के साथ श्रीचफ के जवाब को अपडेट करना, हमारे पास होगा:

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}

1

यह दो अलग-अलग सूचियों, IPV4 और IPV6 में गेटवे पते और यूनिकस्ट पते वाले किसी भी इंटरफेस से पते लौटाता है।

public static (List<IPAddress> V4, List<IPAddress> V6) GetLocal()
{
    List<IPAddress> foundV4 = new List<IPAddress>();
    List<IPAddress> foundV6 = new List<IPAddress>();

    NetworkInterface.GetAllNetworkInterfaces().ToList().ForEach(ni =>
    {
        if (ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null)
        {
            ni.GetIPProperties().UnicastAddresses.ToList().ForEach(ua =>
            {
                if (ua.Address.AddressFamily == AddressFamily.InterNetwork) foundV4.Add(ua.Address);
                if (ua.Address.AddressFamily == AddressFamily.InterNetworkV6) foundV6.Add(ua.Address);
            });
        }
    });

    return (foundV4.Distinct().ToList(), foundV6.Distinct().ToList());
}

नीट समाधान :)
जोहान फ्रेंजेन 13

1

पहले से ही कई उत्तर हैं, लेकिन मैं अभी भी अपना योगदान दे रहा हूं:

public static IPAddress LocalIpAddress() {
    Func<IPAddress, bool> localIpPredicate = ip =>
        ip.AddressFamily == AddressFamily.InterNetwork &&
        ip.ToString().StartsWith("192.168"); //check only for 16-bit block
    return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}

एक लाइन:

public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));

नोट: अंतिम से खोजें क्योंकि यह अभी भी डिवाइस में जोड़े गए कुछ इंटरफेस के बाद काम करता है, जैसे कि मोबाइलहॉटस्पॉट, वीपीएन या अन्य फैंसी वर्चुअल एडेप्टर।


1
इसलिए यदि मेरा स्थानीय आईपी 10.0.2.3 है तो यह नहीं मिला है? यह इस कोड में वास्तव में अजीब है।
फ्रैंकमोरर्स

@frankhommers ने कहा कि केवल 16-बिट ब्लॉक के लिए जाँच करें
nyconing

16 बिट्स ब्लॉक 192.168 की तुलना में कुछ और भी हो सकते हैं
फ्राँखोमर्स

0

ग्राहक आईपी प्राप्त करने के लिए सिर्फ सरल कोड के अलावा:

        public static string getclientIP()
        {
            var HostIP = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
            return HostIP;
        }

आशा है कि यह आपकी मदद करेगा।


0
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].MapToIPv4() //returns 192.168.14.1

यहां छवि विवरण दर्ज करें


5
आपके उत्तर में ओपी के मामले के लिए और भविष्य के पाठकों के लिए यह कैसे काम करता है, इसका विवरण होना चाहिए।
रौनक धूत

भविष्य के पाठकों के लिए अपने उत्तर की व्याख्या शामिल करना बेहतर है।
निकोलस गेरविस

0

प्रत्येक के माध्यम से पुनरावृत्ति करने में सक्षम होने के लिए संशोधित compman2408 का कोड NetworkInterfaceType

public static string GetLocalIPv4 (NetworkInterfaceType _type) {
    string output = null;
    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;
}

और आप इसे ऐसा कह सकते हैं:

static void Main (string[] args) {
    // Get all possible enum values:
    var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();

    foreach (var nitVal in nitVals) {
        Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
    }
}

0
Imports System.Net
Imports System.Net.Sockets
Function LocalIP()
    Dim strHostName = Dns.GetHostName
    Dim Host = Dns.GetHostEntry(strHostName)
    For Each ip In Host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            txtIP.Text = ip.ToString
        End If
    Next

    Return True
End Function

इसी क्रिया के नीचे

समारोह स्थानीयIP ()

स्ट्रिंग के रूप में मंद होस्ट = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString।

txtIP.Text = होस्ट

सच लौटाओ

अंत समारोह


नीचे दिए गए उदाहरण में एक्शन फंक्शन लोकलआईपी () डिम होस्ट अस स्ट्रिंग = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToStxt txtIP.Text = होस्ट रिटर्न ट्रू एंड फंक्शन
योंगजे किम

-2
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

कोड की एक पंक्ति: डी


7
यह कुछ मामलों में OutOfRangeException को फेंक सकता है।
लाउडेनवियर

5
इसके अलावा, आप कैसे जानते हैं कि आपको कौन सा चाहिए? आपके लिए जो सही है वह किसी और के लिए गलत हो सकता है।
मार्क

-3

यदि आपके पास वर्चुअल मशीन या अतिरिक्त नेटवर्क कार्ड हैं तो एड्रेसलिस्ट में अन्य मूल्य हो सकते हैं। मेरा सुझाव एड्रेसलिस्ट और प्रिंट की प्रविष्टियों की जांच करना है जो उचित है। मेरे मामले में प्रविष्टि 3 मेरी मशीन का आईपीवी 4 पता था

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

जोड़ना मत भूलना using System.Net;


1
भूल सुधार; उनमें से सभी आपकी मशीन का आईपी पता हैं। हालाँकि आप जो चाहते हैं, वह पूरी कहानी है। ध्यान दें कि क्रम बदल सकता है, और जिस विधि का आप उपयोग कर रहे हैं, उसके कारण आप हमेशा अनुमान लगाने वाले हैं।
मार्क

यही मैंने कहा, आपको पता सूची की प्रविष्टियों की जांच करनी चाहिए, और हाँ यह अनुमान लगा रहा है, लेकिन सभी प्रविष्टियों को देखने के बाद, अनुमान लगाना बहुत मुश्किल नहीं है
बिबासवन बंद्योपाध्याय

आपको कैसे पता चलेगा कि कौन सा उपयुक्त है? Compman2048 के समाधान का उपयोग करते हुए, आप कम से कम जानते होंगे कि कौन से इंटरफ़ेस से बंधा है।
मार्क

मेरे कंप्यूटर में वह समाधान काम नहीं किया, क्योंकि मेरे पास 2 wlan इंटरफेस, 2 वर्चुअल मशीन और 1 एमुलेटर है, इसलिए मुझे बहुत सारे आईपी मिले। लेकिन अगर आप राउटर द्वारा प्रदान किए गए आंतरिक पते की तलाश कर रहे हैं, तो यह 192 या 172 या 10 के साथ शुरू होगा, यही कारण है कि मैं समझ गया
बिबासवन बंद्योपाध्याय

जब तक आपका राउटर सार्वजनिक आईपी को बाहर नहीं कर देता है, जो असामान्य है लेकिन संभव है।
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.