उस सर्वर का IP पता कैसे प्राप्त करें जिस पर मेरा C # एप्लिकेशन चल रहा है?


365

मैं एक सर्वर चला रहा हूं, और मैं अपना खुद का आईपी पता प्रदर्शित करना चाहता हूं।

कंप्यूटर का स्वयं (यदि संभव हो, बाहरी) आईपी पता प्राप्त करने के लिए वाक्यविन्यास क्या है?

किसी ने निम्नलिखित कोड लिखा था।

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;

हालाँकि, मैं आमतौर पर लेखक का अविश्वास करता हूं, और मैं इस कोड को नहीं समझता। क्या ऐसा करने का एक बेहतर तरीका है?


1
बाहरी आईपी पते के बारे में, मुझे नहीं लगता कि इसे पुनर्प्राप्त करने के लिए एक स्थानीय दृष्टिकोण है। लोकलहोस्ट एक NAT राउटर के पीछे हो सकता है जो सार्वजनिक लोगों को स्थानीय नेटवर्क पते का अनुवाद कर रहा है। क्या यह सत्यापित करने का कोई (स्थानीय) तरीका है? मुझे किसी का भी पता नहीं है ...
थियागो अरैस जूल

IP पता प्राप्त करने के लिए नमूना DNS का उपयोग करता है, मुझे DNS में गलत जानकारी होने का अनुभव है। उस मामले के लिए नमूना गलत जानकारी के साथ प्रतिक्रिया दे सकता है ।
leiflundgren

@leiflundgren मुझे भी गलत जानकारी वाले DNS के साथ अनुभव हुआ है। मेरा उत्तर बताता है कि जब मैंने उस स्थिति का सामना किया, तो मुझे DNS पर भरोसा किए बिना आईपी पते की आवश्यकता कैसे हुई।
डॉ। विली के अपरेंटिस

13
LINQ का प्रयोग:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
लुइस पेरेज़

2
यह एक विशिष्ट स्थिति है, जहां पूरी तरह से अलग-अलग आवश्यकताओं वाले उपयोगकर्ता एक ही प्रश्न पूछते हैं। कुछ लोग जानना चाहते हैं कि उनके कंप्यूटर को सार्वजनिक नेटवर्क से कैसे पहुँचा जा सकता है। विहित उत्तर STUN है , हालाँकि कई उत्तर रैंडम थर्ड पार्टी पर निर्भर हैक्स के साथ हैं। कुछ लोग केवल स्थानीय नेटवर्क पर अपना आईपी पता (तों) जानना चाहते हैं। इस मामले में अच्छे जवाब NetworkInterface.GetAllNetworkInterfaces मेथड का उल्लेख करते हैं
स्टीफन गौरिचोन

जवाबों:


237

नहींं, यह करने के लिए सबसे अच्छा तरीका है। एक मशीन के रूप में कर सकते थे में कई आईपी पते जो आपको उचित खोजने के लिए उनमें से संग्रह को पुनरावृत्त करने की आवश्यकता है।

संपादित करें: केवल एक चीज जो मैं बदलूंगा वह यह बदलना होगी:

if (ip.AddressFamily.ToString() == "InterNetwork")

इसके लिए:

if (ip.AddressFamily == AddressFamily.InterNetwork)

ToStringतुलना के लिए किसी गणना की आवश्यकता नहीं है ।


3
यदि संभव हो तो मुझे बाहरी आईपी पता चाहिए। मुझे लगता है कि अगर मैं एनएटी के पीछे हूं तो यह संभव नहीं होगा।
Nefzen

3
नहीं, आपकी मशीन केवल अपना NAT पता ही जान पाएगी।
एंड्रयू हरे

1
मुझे पूरा यकीन है कि आपको बाहरी पते के लिए एक बाहरी सर्वर तक पहुंचने की आवश्यकता होगी।
बजे थियागो अराइज़ जूल

29
breakआईपी ​​के बाद अनावश्यक रूप से पुनरावृत्ति से बचने के लिए पाए जाने के बाद मैं एक बयान का सुझाव भी दूंगा (इस मामले में मुझे संदेह है कि प्रदर्शन प्रभाव कभी भी मायने रखेगा, लेकिन मुझे आमतौर पर अच्छी कोडिंग की आदत डालना पसंद है)
एरिक जे।

7
ध्यान दें कि यह तब विफल हो सकता है जब एक मशीन में कई 'इंटर नेटवर्क' पोर्ट होते हैं (मेरे मामले में: एक ईथरनेट कार्ड एक वर्चुअल मशीन पोर्ट)। वर्तमान कोड आपको सूची में अंतिम आईपी देगा।
ईसाई अध्ययनकर्ता

168

अपने सार्वजनिक आईपी को जानने का एकमात्र तरीका किसी और से आपको बताने के लिए पूछना है; यह कोड आपकी मदद कर सकता है:

public string GetPublicIP()
{
    String direction = "";
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }

    //Search for the ip in the html
    int first = direction.IndexOf("Address: ") + 9;
    int last = direction.LastIndexOf("</body>");
    direction = direction.Substring(first, last - first);

    return direction;
}

20
क्या आप जानते हैं कि आपका कोड नमूना प्रश्न 13 में उल्लेख किया गया था? प्रस्तुतकर्ता आपके कोड को चुराने के लिए माफी माँगता है। 8:30 मिनट से। देखें इस । :)
एरविन रूइजाक्कर्स

4
दुर्भाग्य से लिंक मर चुका है।
बैरी ग्वेनकेया

यदि कोई इसे देखना चाहता है तो नया लिंक
किममैक्स

1
कृपया लिंक का उपयोग करें ipof.in/txt ताकि आप सभी HTML पार्सिंग कोड के बिना सीधे आईपी प्राप्त कर सकें
vivekv

82

क्लीनर और एक समाधान में सभी: डी

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

3
इस कोड की समस्याएं: * यह मानता है कि कंप्यूटर में केवल एक ही IP पता होता है। कई के कई हैं। * यह केवल IPV4 पते पर विचार करता है। IPN6 को शामिल करने के लिए InterNetworkV6 जोड़ें।
रॉबर्ट ब्राटन

1
@RobertBratton, आपके रिप्ले के लिए धन्यवाद। समस्या ने एक बहु आईपी पते या आईपीवी 6 को ग्रहण नहीं किया, इस कोड में मामूली संशोधन के साथ यह विशिष्ट विभिन्न समस्याओं को संभाल सकता है।
मोहम्मद ए। फादिल

50

यदि आप एक DNS सर्वर से अपना आईपी पता प्राप्त करने पर भरोसा नहीं कर सकते हैं (जो मेरे साथ हुआ है), आप निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं:

System.Net.NetworkInformation नामस्थान में एक NetworkInterface वर्ग होता है , जिसमें एक स्थिर GetAllNetworkInterfaces विधि होती है

यह विधि आपकी मशीन पर सभी "नेटवर्क इंटरफेस" को वापस कर देगी, और आम तौर पर काफी कुछ हैं, भले ही आपके पास एक वायरलेस एडेप्टर और / या आपके मशीन पर एक ईथरनेट एडाप्टर हार्डवेयर स्थापित हो। इन सभी नेटवर्क इंटरफेस में आपके स्थानीय मशीन के लिए मान्य आईपी पते हैं, हालाँकि आप शायद केवल एक ही चाहते हैं।

यदि आप एक आईपी पते की तलाश कर रहे हैं, तो आपको सूची को तब तक फ़िल्टर करना होगा जब तक आप सही पते की पहचान नहीं कर लेते। आपको शायद कुछ प्रयोग करने की आवश्यकता होगी, लेकिन मुझे निम्नलिखित दृष्टिकोण के साथ सफलता मिली:

  • किसी भी NetworkInterfaces को फ़िल्टर करें जो जाँचने के द्वारा निष्क्रिय है OperationalStatus == OperationalStatus.Up। उदाहरण के लिए, यदि आपके पास नेटवर्क केबल प्लग इन नहीं है, तो यह आपके भौतिक ईथरनेट एडाप्टर को बाहर कर देगा।

प्रत्येक NetworkInterface लिए, आप एक प्राप्त कर सकते हैं IPInterfaceProperties का उपयोग कर वस्तु GetIPProperties विधि , और से एक IPInterfaceProperties आपत्ति आप उपयोग कर सकते हैं UnicastAddresses संपत्ति की सूची के लिए UnicastIPAddressInformation वस्तुओं।

  • के लिए जाँच करके गैर-पसंदीदा यूनिकास्ट पतों को फ़िल्टर करें DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • के लिए जाँच करके "वर्चुअल" पतों को फ़िल्टर करें AddressPreferredLifetime != UInt32.MaxValue

इस बिंदु पर मैं पहले (यदि कोई हो) के पते को लेता हूं जो इन फिल्टर से मेल खाता है।

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

[डुप्लिकेट एड्रेस डिटेक्शन स्टेट और पसंदीदा आजीवन के लिए उपरोक्त पाठ में उल्लिखित शर्तों को शामिल करने के लिए 16 मई, 2018 को संशोधित कोड]

नीचे दिया गया नमूना परिचालन स्थिति, पता परिवार, लूपबैक पते (127.0.0.1) को छोड़कर, डुप्लिकेट एड्रेस डिटेक्शन स्टेट और पसंदीदा जीवनकाल को छोड़कर फ़िल्टरिंग प्रदर्शित करता है।

static IEnumerable<IPAddress> GetLocalIpAddresses()
{
    // Get the list of network interfaces for the local computer.
    var adapters = NetworkInterface.GetAllNetworkInterfaces();

    // Return the list of local IPv4 addresses excluding the local
    // host, disconnected, and virtual addresses.
    return (from adapter in adapters
            let properties = adapter.GetIPProperties()
            from address in properties.UnicastAddresses
            where adapter.OperationalStatus == OperationalStatus.Up &&
                  address.Address.AddressFamily == AddressFamily.InterNetwork &&
                  !address.Equals(IPAddress.Loopback) &&
                  address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
                  address.AddressPreferredLifetime != UInt32.MaxValue
            select address.Address);
}

2
इस विशेष मामले में, ओपी अपना बाहरी आईपी पता देखना चाहता था, इसलिए डीएनएस समाधान संभवतः जाने का रास्ता है। लेकिन स्थानीय आईपी पते को पुनरावृत्त करने के लिए, यह वह तरीका है जो मैं सुझाता हूं।
मैट डेविस

3
सहमत है कि DNS IP पता प्राप्त करने का एक आसान तरीका है। मैंने अपने उत्तर में उल्लेख किया है कि यह दृष्टिकोण तब काम करता है जब आपका DNS अविश्वसनीय होता है। मैंने इसका उपयोग ऐसे वातावरण में किया, जहां DNS को गड़बड़ कर दिया गया था, यदि आप एक ईथरनेट पोर्ट से दूसरे में मशीन ले जाते हैं, तो DNS अभी भी पुराने आईपी पते की रिपोर्ट करेगा, इसलिए यह मेरे उद्देश्यों के लिए लगभग बेकार था।
डॉ। विली के प्रशिक्षु

मैं सभी विवरण की सराहना करता हूं, लेकिन आपको कोड नमूना भी पोस्ट करना चाहिए।
आइडिन

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

37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");

ifconfig.me/ip अब काम नहीं करता है। Api.ipify.org या इसके बजाय डौग की टिप्पणी में लिंक का प्रयास करें
केनी 83

16
using System.Net;

string host = Dns.GetHostName();
IPHostEntry ip = Dns.GetHostEntry(host);
Console.WriteLine(ip.AddressList[0].ToString());

बस मेरी मशीन पर यह परीक्षण किया और यह काम करता है।


3
इसे यू लोकल आईपी मिलेगा, और सवाल बाहरी IP यानी I के बारे में है, जिसके साथ आप इंटरनेट ब्राउज़ करते हैं ..
संग्राम नंदखिले

15

यदि आप DNS का उपयोग करने से बचना चाहते हैं:

List<IPAddress> ipList = new List<IPAddress>();
foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (var address in netInterface.GetIPProperties().UnicastAddresses)
    {
        if (address.Address.AddressFamily == AddressFamily.InterNetwork)
        {
            Console.WriteLine("found IP " + address.Address.ToString());
            ipList.Add(address.Address);
        }
    }
}

9

InterNetwork पर हर समय भरोसा न करें क्योंकि आपके पास एक से अधिक डिवाइस हो सकते हैं जो IP4 का भी उपयोग करते हैं जो आपके आईपी को प्राप्त करने में परिणाम को खराब कर देगा। अब, यदि आप चाहें तो आप इसे कॉपी कर सकते हैं और कृपया इसकी समीक्षा करें या इसे अपडेट करें कि आप कैसे फिट दिखते हैं।

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

फिर हमें कंप्यूटर की IPAddresses की सूची प्राप्त करने की आवश्यकता है। यह वह जगह है जहाँ चीजें इतनी कठिन नहीं हैं क्योंकि राउटर (सभी राउटर) 4 बाइट्स (...) का उपयोग करते हैं। पहले तीन सबसे महत्वपूर्ण हैं क्योंकि इससे जुड़े किसी भी कंप्यूटर में पहले तीन बाइट्स से मेल खाता IP4 पता होगा। Ex: 192.168.0.1 राउटर डिफ़ॉल्ट आईपी के लिए मानक है जब तक कि इसके प्रशासक द्वारा परिवर्तित नहीं किया जाता है। '192.168.0' या वे जो कुछ भी हो सकते हैं, हमें मेल खाने की जरूरत है। और वह सब मैंने IsAddressOfGateway फ़ंक्शन में किया था। लंबाई मिलान का कारण है क्योंकि सभी पते (जो केवल कंप्यूटर के लिए हैं) की लंबाई 4 बाइट्स है। यदि आप cmd में netstat टाइप करते हैं, तो आप इसे सही पाएंगे। इसलिए यह अब आपके पास है। हाँ, यह वास्तव में आप क्या देख रहे हैं पाने के लिए थोड़ा और काम लेता है। उन्मूलन की प्रक्रिया। और भगवान के लिए, इसे पिंग करके पता न लगाएं जो समय लेता है क्योंकि पहले आप पते को पिंग करने के लिए भेज रहे हैं और फिर उसे परिणाम वापस भेजना है। नहीं, सीधे .Net कक्षाओं के साथ काम करें जो आपके सिस्टम वातावरण से निपटते हैं और आपको वे उत्तर मिलेंगे जिनकी आपको तलाश है जब इसे केवल आपके कंप्यूटर के साथ करना है।

अब यदि आप सीधे अपने मॉडेम से जुड़े हैं, तो प्रक्रिया लगभग समान है क्योंकि मॉडेम आपका प्रवेश द्वार है, लेकिन सबमस्क समान नहीं है क्योंकि आपके मॉडेम के माध्यम से सीधे आपके DNS सर्वर से सूचना प्राप्त हो रही है और राउटर द्वारा नकाबपोश नहीं है। आपके लिए इंटरनेट यद्यपि आप अभी भी उसी कोड का उपयोग कर सकते हैं क्योंकि मॉडेम को सौंपा गया आईपी का अंतिम बाइट 1. है। यदि मॉडेम से भेजा गया आईपी 111.111.111.1 है, तो आपको 111.111.111 मिलेगा (कुछ बाइट मान)। हमें ध्यान रखें कि हमें गेटवे की जानकारी प्राप्त करने की आवश्यकता है क्योंकि ऐसे अधिक उपकरण हैं जो आपके राउटर और मॉडेम की तुलना में इंटरनेट कनेक्टिविटी से निपटते हैं।

अब आप देखते हैं कि आप अपने राउटर के पहले दो बाइट्स 192 और 168 को क्यों नहीं बदलते हैं। ये केवल राउटर के लिए सख्ती से प्रतिष्ठित हैं और इंटरनेट उपयोग के लिए नहीं हैं या हमारे पास आईपी प्रोटोकॉल के साथ एक गंभीर मुद्दा होगा और आपके कंप्यूटर को क्रैश करने के परिणामस्वरूप डबल पिंग होगा। छवि कि आपका निर्दिष्ट राउटर आईपी 192.168.44.103 है और आप उस आईपी के साथ एक साइट पर भी क्लिक करते हैं। हे भगवान! आपके कंप्यूटर को पता नहीं होगा कि पिंग क्या है। वहीं क्रैश हो गया। इस समस्या से बचने के लिए, केवल राउटरों को इनको असाइन किया जाता है और इंटरनेट उपयोग के लिए नहीं। इसलिए राउटर के पहले दो बाइट को अकेले छोड़ दें।

static IPAddress FindLanAddress()
{
    IPAddress gateway = FindGetGatewayAddress();
    if (gateway == null)
        return null;

    IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress address in pIPAddress)            {
        if (IsAddressOfGateway(address, gateway))
                return address;
    return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
    if (address != null && gateway != null)
        return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
    return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
    if (address != null && gateway != null)
    {
        int gwLen = gateway.Length;
        if (gwLen > 0)
        {
            if (address.Length == gateway.Length)
            {
                --gwLen;
                int counter = 0;
                for (int i = 0; i < gwLen; i++)
                {
                    if (address[i] == gateway[i])
                        ++counter;
                }
                return (counter == gwLen);
            }
        }
    }
    return false;

}
static IPAddress FindGetGatewayAddress()
{
    IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();

    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipInfProps = ni.GetIPProperties();
        foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
            return gi.Address;
    }
    return null;
}

1
इसका कोई मतलब नहीं है: foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses) रिटर्न gi.Address;
एडविन इवांस

3
इस बात की कोई गारंटी नहीं है कि "गेटवे से जुड़े किसी भी कंप्यूटर में पहले तीन बाइट्स से मेल खाता IP4 पता होगा"। यह सबनेट मास्क पर निर्भर करता है, जिसमें विभिन्न बिट संयोजन हो सकते हैं। और इसके अलावा, बाइट्स शुरू करने के लिए "192.168" नहीं होना चाहिए, जैसा कि यहां वर्णित है । यह कोड केवल तभी काम करेगा जब सबनेट मास्क हो 255.255.255.0, और यह एक अधिक जटिल तरीके से आईएमओ में ऐसा करेगा।
ग्रू

8

मैंने सिर्फ सोचा था कि मैं अपना खुद का, एक-लाइनर (भले ही पहले से ही कई अन्य उपयोगी उत्तर हैं) जोड़ दूंगा।


string ipAddress = new WebClient().DownloadString("http://icanhazip.com");


4
ध्यान दें कि यह एक संभावित मेमोरी लीक है। WebClient का ठीक से निपटान नहीं किया गया है। इसके बजाय, उपयोग करें: (var क्लाइंट = नया WebClient ()) {return client.DownloadString (" icanhazip.com /") ट्रिम () ; }
FOO

4

वर्तमान सार्वजनिक IP पता प्राप्त करने के लिए, आपको बस एक ASPX पृष्ठ बनाना होगा, जो पेज लोड घटना पर निम्नलिखित पंक्ति के साथ होगा:

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());

4

यदि आप इंट्रानेट में चल रहे हैं, तो आप स्थानीय मशीन आईपी पता प्राप्त करने में सक्षम होंगे और यदि आपको इसके साथ बाहरी आईपी पता नहीं मिलेगा: वेब:

//this will bring the IP for the current machine on browser
System.Web.HttpContext.Current.Request.UserHostAddress

डेस्कटॉप:

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());

3
namespace NKUtilities 
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    public class DNSUtility
    {
        public static int Main(string [] args)
        {
            string strHostName = "";
            try {

                if(args.Length == 0)
                {
                    // 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);
                }
                else
                {
                    // Otherwise, get the IP address of the host provided on the command line.
                    strHostName = args[0];
                }

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

            } 
            catch(SocketException se) 
            {
                Console.WriteLine("{0} ({1})", se.Message, strHostName);
                return -1;
            } 
            catch(Exception ex) 
            {
                Console.WriteLine("Error: {0}.", ex.Message);
                return -1;
            }
        }
    }
}

यहाँ देखो जानकारी के लिए।

आपको याद रखना होगा कि आपके कंप्यूटर में एक से अधिक आईपी हो सकते हैं (वास्तव में यह हमेशा होता है) - इसलिए आप एक के बाद एक हैं।


2

इसे इस्तेमाल करे:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();

1
यह कई स्थानीय IP पते लौटाता है, जिनमें से एक IPv4 पता है, हालांकि सूची में सही एक को ढूंढना मुश्किल है।
कंटैंगो

1

हो सकता है कि बाहरी आईपी द्वारा आप (यदि आप एक वेब सर्वर संदर्भ में हैं) इस पर विचार कर सकते हैं

Request.ServerVariables["LOCAL_ADDR"];

मैं आपसे एक ही सवाल पूछ रहा था और मैंने इसे इस स्टैकओवरफ़्लो लेख में पाया ।

इसने मेरे लिए काम किया।


1
namespace NKUtilities 
{
    using System;
    using System.Net;

    public class DNSUtility
    {
        public static int Main (string [] args)
        {

          String strHostName = new String ("");
          if (args.Length == 0)
          {
              // 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);
          }
          else
          {
              strHostName = args[0];
          }

          // Then using host name, get the IP address list..
          IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
          IPAddress [] addr = ipEntry.AddressList;

          for (int i = 0; i < addr.Length; i++)
          {
              Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
          }
          return 0;
        }    
     }
}

1
using System;
using System.Net;

namespace IPADDRESS
{
    class Program
    {
        static void Main(string[] args)
        {
            String strHostName = string.Empty;
            if (args.Length == 0)
            {                
                /* First get the host name of local machine.*/
                strHostName = Dns.GetHostName();
                Console.WriteLine("Local Machine's Host Name: " + strHostName);
            }
            else
            {
                strHostName = args[0];
            }
            /* Then using host name, get the IP address list..*/
            IPHostEntry ipEntry = Dns.GetHostByName(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();
        }
    }
}

1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

कोड की सरल सिंगल लाइन जो पहले आंतरिक IPV4 पता या अशक्त देता है यदि कोई नहीं है। ऊपर एक टिप्पणी के रूप में जोड़ा गया, लेकिन किसी के लिए उपयोगी हो सकता है (ऊपर दिए गए कुछ समाधान कई पते लौटाएंगे जिन्हें आगे फ़िल्टरिंग की आवश्यकता है)।

यह भी आसान है कि मुझे लगता है कि अशक्त के बजाय लूपबैक लौटना है:

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );

1
कैसे के बारे में IPAddress.Loopback? :)
कोडथेरेपिस्ट

1

आईपी ​​पता सूची खोजने के लिए मैंने इस समाधान का उपयोग किया है

public static IEnumerable<string> GetAddresses()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}

लेकिन मुझे व्यक्तिगत रूप से स्थानीय मान्य आईपी ​​पता प्राप्त करने के लिए नीचे दिए गए समाधान पसंद हैं

public static IPAddress GetIPAddress(string hostName)
{
    Ping ping = new Ping();
    var replay = ping.Send(hostName);

    if (replay.Status == IPStatus.Success)
    {
        return replay.Address;
    }
    return null;
 }

public static void Main()
{
    Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName()));
    Console.WriteLine("Google IP:" + GetIPAddress("google.com");
    Console.ReadLine();
}


1

यहाँ है कि मैं इसे कैसे हल किया। मुझे पता है कि अगर आपके पास कई भौतिक इंटरफेस हैं, तो यह आपके इच्छित सटीक चयन का चयन नहीं कर सकता है।

private string FetchIP()
{
    //Get all IP registered
    List<string> IPList = new List<string>();
    IPHostEntry host;
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            IPList.Add(ip.ToString());
        }
    }

    //Find the first IP which is not only local
    foreach (string a in IPList)
    {
        Ping p = new Ping();
        string[] b = a.Split('.');
        string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1";
        PingReply t = p.Send(ip2);
        p.Dispose();
        if (t.Status == IPStatus.Success && ip2 != a)
        {
            return a;
        }
    }
    return null;
}


1

LINQ का उपयोग करते हुए स्ट्रिंग के रूप में सभी IP पते प्राप्त करें:

using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
...
string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork)
        .Select(d=>d.Address.ToString())
    ).ToArray();

जारी रखने के लिए फ़िल्टर करें ...

सबसे पहले, एक विस्तार विधि को परिभाषित करें IsPrivate():

public static class IPAddressExtensions
{
    // Collection of private CIDRs (IpAddress/Mask) 
    private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}
        .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress
                                    .Parse(c.Split('/')[0]).GetAddressBytes(), 0)
                              , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1])))))
        .ToArray();
    public static bool IsPrivate(this IPAddress ipAddress)
    {
        int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0);
        return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2));           
    }
}

... और फिर इसका उपयोग निजी आईपी को फ़िल्टर करने के लिए करें:

string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork
            && !d.Address.IsPrivate() // Filter out private ones
        )
        .Select(d=>d.Address.ToString())
    ).ToArray();

1

यह मेरे लिए काम करता है ... और एक DNS सर्वर को क्वेरी करने की तुलना में ज्यादातर मामलों में (यदि सभी नहीं तो) तेज होना चाहिए। डॉ। विली के प्रशिक्षु ( यहां ) के लिए धन्यवाद ।

// ************************************************************************
/// <summary>
/// Will search for the an active NetworkInterafce that has a Gateway, otherwise
/// it will fallback to try from the DNS which is not safe.
/// </summary>
/// <returns></returns>
public static NetworkInterface GetMainNetworkInterface()
{
    List<NetworkInterface> candidates = new List<NetworkInterface>();

    if (NetworkInterface.GetIsNetworkAvailable())
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (
            NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
                candidates.Add(ni);
        }
    }

    if (candidates.Count == 1)
    {
        return candidates[0];
    }

    // Accoring to our tech, the main NetworkInterface should have a Gateway 
    // and it should be the ony one with a gateway.
    if (candidates.Count > 1)
    {
        for (int n = candidates.Count - 1; n >= 0; n--)
        {
            if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
            {
                candidates.RemoveAt(n);
            }
        }

        if (candidates.Count == 1)
        {
            return candidates[0];
        }
    }

    // Fallback to try by getting my ipAdress from the dns
    IPAddress myMainIpAdress = null;
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
        {
            myMainIpAdress = ip;
            break;
        }
    }

    if (myMainIpAdress != null)
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.Address.Equals(myMainIpAdress))
                    {
                        return ni;
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// AddressFamily.InterNetwork = IPv4
/// Thanks to Dr. Wilys Apprentice at
/// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
/// using System.Net.NetworkInformation;
/// </summary>
/// <param name="mac"></param>
/// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
/// <returns></returns>
public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
{
    NetworkInterface[] NetworkInterfaces =
        NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface ni in NetworkInterfaces)
    {
        if (ni.GetPhysicalAddress().Equals(mac))
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                    {
                        if (ai.Address.AddressFamily == addressFamily)
                        {
                            return ai.Address;
                        }
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
/// '?.ToString() ?? ""' on the result.
/// </summary>
/// <returns></returns>
public static IPAddress GetMyInternetIpAddress()
{
    NetworkInterface ni = GetMainNetworkInterface();
    IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
    if (ipAddress == null) // could it be possible ?
    {
        ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
    }

    return ipAddress;
}

// ******************************************************************

संदर्भ के रूप में यह पूर्ण वर्ग कोड है जहां मैंने इसे परिभाषित किया है:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace TcpMonitor
{
    /*
        Usage:
                var cons = TcpHelper.GetAllTCPConnections();
                foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ...
    */

    public class NetHelper
    {
        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0);

        public enum UDP_TABLE_CLASS
        {
            UDP_TABLE_BASIC,
            UDP_TABLE_OWNER_PID,
            UDP_TABLE_OWNER_MODULE
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPROW_OWNER_PID
        {
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;
            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, localScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections()
        {
            return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET);
        }

        public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections()
        {
            return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
            IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(udpTablePtr);
            }

            return result;
        }

        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0);



        public enum MIB_TCP_STATE
        {
            MIB_TCP_STATE_CLOSED = 1,
            MIB_TCP_STATE_LISTEN = 2,
            MIB_TCP_STATE_SYN_SENT = 3,
            MIB_TCP_STATE_SYN_RCVD = 4,
            MIB_TCP_STATE_ESTAB = 5,
            MIB_TCP_STATE_FIN_WAIT1 = 6,
            MIB_TCP_STATE_FIN_WAIT2 = 7,
            MIB_TCP_STATE_CLOSE_WAIT = 8,
            MIB_TCP_STATE_CLOSING = 9,
            MIB_TCP_STATE_LAST_ACK = 10,
            MIB_TCP_STATE_TIME_WAIT = 11,
            MIB_TCP_STATE_DELETE_TCB = 12
        }

        public enum TCP_TABLE_CLASS
        {
            TCP_TABLE_BASIC_LISTENER,
            TCP_TABLE_BASIC_CONNECTIONS,
            TCP_TABLE_BASIC_ALL,
            TCP_TABLE_OWNER_PID_LISTENER,
            TCP_TABLE_OWNER_PID_CONNECTIONS,
            TCP_TABLE_OWNER_PID_ALL,
            TCP_TABLE_OWNER_MODULE_LISTENER,
            TCP_TABLE_OWNER_MODULE_CONNECTIONS,
            TCP_TABLE_OWNER_MODULE_ALL
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPROW_OWNER_PID
        {
            public uint state;
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint remoteAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0);
                }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr); }
            }

            public ushort RemotePort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0);
                }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] remoteAddr;
            public uint remoteScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint state;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public long LocalScopeId
            {
                get { return localScopeId; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, LocalScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }

            public long RemoteScopeId
            {
                get { return remoteScopeId; }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr, RemoteScopeId); }
            }

            public ushort RemotePort
            {
                get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork
        public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

        public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync()
        {
            return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET));
        }

        public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()
        {
            return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);
        }

        public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync()
        {
            return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6));
        }

        public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()
        {
            return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
            IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(tcpTablePtr);
            }

            return result;
        }

        public static string GetTcpStateName(MIB_TCP_STATE state)
        {
            switch (state)
            {
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED:
                    return "Closed";
                case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN:
                    return "Listen";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT:
                    return "SynSent";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD:
                    return "SynReceived";
                case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB:
                    return "Established";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1:
                    return "FinWait 1";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2:
                    return "FinWait 2";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT:
                    return "CloseWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING:
                    return "Closing";
                case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK:
                    return "LastAck";
                case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT:
                    return "TimeWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB:
                    return "DeleteTCB";
                default:
                    return ((int)state).ToString();
            }
        }

        private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>();

        public const string UnknownHostName = "Unknown";

        // ******************************************************************
        public static string GetHostName(IPAddress ipAddress)
        {
            return GetHostName(ipAddress.ToString());
        }

        // ******************************************************************
        public static string GetHostName(string ipAddress)
        {
            string hostName = null;

            if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName))
            {
                try
                {
                    if (ipAddress == "0.0.0.0" || ipAddress == "::")
                    {
                        hostName = ipAddress;
                    }
                    else
                    {
                        hostName = Dns.GetHostEntry(ipAddress).HostName;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    hostName = UnknownHostName;
                }

                DicOfIpToHostName[ipAddress] = hostName;
            }

            return hostName;
        }

        // ************************************************************************
        /// <summary>
        /// Will search for the an active NetworkInterafce that has a Gateway, otherwise
        /// it will fallback to try from the DNS which is not safe.
        /// </summary>
        /// <returns></returns>
        public static NetworkInterface GetMainNetworkInterface()
        {
            List<NetworkInterface> candidates = new List<NetworkInterface>();

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (
                    NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                        candidates.Add(ni);
                }
            }

            if (candidates.Count == 1)
            {
                return candidates[0];
            }

            // Accoring to our tech, the main NetworkInterface should have a Gateway 
            // and it should be the ony one with a gateway.
            if (candidates.Count > 1)
            {
                for (int n = candidates.Count - 1; n >= 0; n--)
                {
                    if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
                    {
                        candidates.RemoveAt(n);
                    }
                }

                if (candidates.Count == 1)
                {
                    return candidates[0];
                }
            }

            // Fallback to try by getting my ipAdress from the dns
            IPAddress myMainIpAdress = null;
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
                {
                    myMainIpAdress = ip;
                    break;
                }
            }

            if (myMainIpAdress != null)
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.Address.Equals(myMainIpAdress))
                            {
                                return ni;
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// AddressFamily.InterNetwork = IPv4
        /// Thanks to Dr. Wilys Apprentice at
        /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
        /// using System.Net.NetworkInformation;
        /// </summary>
        /// <param name="mac"></param>
        /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
        /// <returns></returns>
        public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
        {
            NetworkInterface[] NetworkInterfaces =
                NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface ni in NetworkInterfaces)
            {
                if (ni.GetPhysicalAddress().Equals(mac))
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                            {
                                if (ai.Address.AddressFamily == addressFamily)
                                {
                                    return ai.Address;
                                }
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
        /// '?.ToString() ?? ""' on the result.
        /// </summary>
        /// <returns></returns>
        public static IPAddress GetMyInternetIpAddress()
        {
            NetworkInterface ni = GetMainNetworkInterface();
            IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
            if (ipAddress == null) // could it be possible ?
            {
                ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
            }

            return ipAddress;
        }

        // ******************************************************************
        public static bool IsBroadcastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.GetAddressBytes()[3] == 255;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return false; // NO broadcast in IPv6
            }

            return false;
        }

        // ******************************************************************
        public static bool IsMulticastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx
                return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return ipAddress.IsIPv6Multicast;
            }

            return false;
        }

        // ******************************************************************

    }
}

1

अपने सार्वजनिक आईपी पते को प्राप्त करने का एक और तरीका है OpenDNS के resolve1.opendns.comसर्वर का उपयोग करनाmyip.opendns.com को अनुरोध के रूप में ।

कमांड लाइन पर यह है:

  nslookup myip.opendns.com resolver1.opendns.com

या DNSClient नगेट का उपयोग करके C # में:

  var lookup = new LookupClient(new IPAddress(new byte[] { 208, 67, 222, 222 }));
  var result = lookup.Query("myip.opendns.com", QueryType.ANY);

यह http समापन बिंदु और पार्सिंग प्रतिक्रियाओं को मारने की तुलना में थोड़ा क्लीनर है।


0

और यह VB.NET में सीएसवी प्रारूप में सभी स्थानीय आईपी प्राप्त करना है

Imports System.Net
Imports System.Net.Sockets

Function GetIPAddress() As String
    Dim ipList As List(Of String) = New List(Of String)
    Dim host As IPHostEntry
    Dim localIP As String = "?"
    host = Dns.GetHostEntry(Dns.GetHostName())
    For Each ip As IPAddress In host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            localIP = ip.ToString()
            ipList.Add(localIP)
        End If
    Next
    Dim ret As String = String.Join(",", ipList.ToArray)
    Return ret
End Function

0

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

इस सरल कोड का उपयोग करने के लिए downsides: (जो अनुशंसित है) यह है कि आपके दूरस्थ आईपी पते को प्राप्त करने में 3-5 सेकंड का समय लगेगा क्योंकि WebClient जब प्रारंभ में आपकी प्रॉक्सी सेटिंग्स की जांच करने में हमेशा 3-5 सेकंड लेता है।

 public static string GetIP()
 {
            string externalIP = "";
            externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                           .Matches(externalIP)[0].ToString();
            return externalIP;
 }

यहां बताया गया है कि मैंने इसे कैसे तय किया .. (पहली बार अभी भी 3-5 सेकंड लगते हैं) लेकिन इसके बाद यह हमेशा आपके कनेक्शन के आधार पर 0-2 सेकंड में आपका रिमोट आईपी एड्रेस प्राप्त करेगा।

public static WebClient webclient = new WebClient();
public static string GetIP()
{
    string externalIP = "";
    externalIP = webclient.DownloadString("http://checkip.dyndns.org/");
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                   .Matches(externalIP)[0].ToString();
    return externalIP;
}

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