2009-12-24 13 views
9

को संदर्भित करने का परीक्षण कैसे करें यदि कोई मेजबाननाम (स्ट्रिंग) स्थानीय कंप्यूटर पर हल हो जाता है तो क्या कोई Win32 या .NET में बताने का एक आसान तरीका सोच सकता है? जैसे:मेजबाननाम स्थानीय मशीन

"myhostname" 
"myhostname.mydomain.local" 
"192.168.1.1" 
"localhost" 

इस अभ्यास का लक्ष्य एक परीक्षण है जो अगर विंडोज सुरक्षा परत स्थानीय या नेटवर्क

उत्तर

7

नेट आप कर सकते हैं के रूप में मशीन का उपयोग करने के व्यवहार करेगा बता देगा का उत्पादन होता है:

IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName()); 

फिर किसी भी होस्ट नाम के लिए, यह जांचें कि क्या यह iphostEntry.AddressList में आईपी में से किसी एक को हल करता है (यह एक आईपीएड्रेस [] है)।

using System; 
using System.Net; 

class Test { 
    static void Main (string [] args) 
    { 
     IPHostEntry iphostentry = Dns.GetHostEntry (Dns.GetHostName()); 
     foreach (string str in args) { 
      IPHostEntry other = null; 
      try { 
       other = Dns.GetHostEntry (str); 
      } catch { 
       Console.WriteLine ("Unknown host: {0}", str); 
       continue; 
      } 
      foreach (IPAddress addr in other.AddressList) { 
       if (IPAddress.IsLoopback (addr) || Array.IndexOf (iphostentry.AddressList, addr) != -1) { 
        Console.WriteLine ("{0} IsLocal", str); 
        break; 
       } 
      } 
     } 
    } 
} 
+1

टिस ने काम किया, हालांकि ऐसा लगता है कि यह "127.0.0.1" जैसे पते के लिए परीक्षण नहीं करता है। यह एक काम करता है (यदि आपको लगता है तो अपनी पोस्ट को अपडेट करने के लिए स्वतंत्र महसूस करें): var local_ip = (आईएन से डीएनएस.गेटहोस्टएन्ट्री (डीएनएस.गेटहोस्टनाम()) में। एड्रेसलिस्ट आईपी का चयन करें)। टॉलिस्ट(); local_ip.Add (IPAddress.Loopback); local_ip.Add (IPAddress.IPv6Loopback); var target_ip = Dns.GetHostEntry (लक्ष्य)। एड्रेसलिस्ट; var intersect = ip1 से target_ip में आईपी 2 में स्थानीय_आईपी आईपी 1 पर आईपी 2 आईपी 1 के बराबर है; वापसी intersect.Any(); – galets

1

आप Dns.Resolve(hostName).AddressList[0].ToString() लिख कर करने के लिए IP पता होस्ट नाम का समाधान करता है प्राप्त कर सकते हैं:

यहाँ एक पूरा कार्यक्रम है कि मेजबान के नाम/आईपी कमांड लाइन में पारित पतों की जांच करेंगे।

तब आप इसकी तुलना 127.0.0.1 या कंप्यूटर के स्थानीय आईपी पते से कर सकते हैं।

आप System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList के माध्यम से लूपिंग करके कंप्यूटर के स्थानीय आईपी पते प्राप्त कर सकते हैं।

0

इन नेट में आप Request.ServerVariables ("REMOTE_ADDR") का उपयोग करने में सक्षम होना चाहिए; मेजबान आईपी पता प्राप्त करने के लिए और फिर मेजबाननाम के हल किए गए आईपी पते के साथ इसकी तुलना करें। क्या वह नहीं है जो आप चाहते थे?

+0

यह केवल एएसपी.NET अनुप्रयोगों के लिए काम करेगा। – Gonzalo

+0

यह केवल एएसपी.Net अनुरोध के दौरान सच है। साथ ही, आपको 'Request.UserHostAddress' का उपयोग करना चाहिए। – SLaks

3

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

public static bool IsLocalHost(string host) 
{ 
    IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName()); 

    IPAddress ipAddress = null; 

    if (IPAddress.TryParse(host, out ipAddress)) 
     return localHost.AddressList.Any(x => x.Equals(ipAddress)); 

    IPHostEntry hostEntry = Dns.GetHostEntry(host); 

    return localHost.AddressList.Any(x => hostEntry.AddressList.Any(y => x.Equals(y))); 
} 
1

थोड़ा PhilDulac से समाधान नवीनतम मेरा, पहले जांच करता है, तो स्थानीय होस्ट से कुछ के साथ एलियास किया गया उपनाम hosts/etc में परिभाषित किया गया है, अन्य भाग PhilDulac से समाधान है।

public static bool IsLocalHost(Uri uri) 
{ 
    bool isLocalhost = false; 
    string hostName = uri.Host; 

    IPHostEntry localhost = Dns.GetHostEntry("127.0.0.1"); 
    if (uri.Host == localhost.HostName) 
    { 
     IPHostEntry hostEntry = Dns.GetHostEntry(hostName); 
     isLocalhost = hostEntry.AddressList.Any(IPAddress.IsLoopback); 
    } 

    if (!isLocalhost) 
    { 
     localhost = Dns.GetHostEntry(Dns.GetHostName()); 

     IPAddress ipAddress = null; 

     if (IPAddress.TryParse(hostName, out ipAddress)) 
      isLocalhost = localhost.AddressList.Any(x => x.Equals(ipAddress)); 

     if (!isLocalhost) 
     { 
      try 
      { 
       var hostEntry = Dns.GetHostEntry(hostName); 
       isLocalhost = localhost.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals)); 
      } 
      catch (SocketException e) 
      { 
       Debug.WriteLine(e); 
      } 
     } 
    } 

    return isLocalhost; 
} 
+0

अच्छा प्रयास करें, लेकिन आईपीवी 6 समर्थन गायब है :) – galets

+0

क्या आपके पास कोई वास्तविक उदाहरण है जहां यह ipv6 के साथ विफल रहता है? – psulek

+0

':: 1' ipv6 में localhost है। आप '127.0.0.1' के लिए परीक्षण कर रहे हैं, जो आईपीवी 4 लोकलहोस्ट है, लेकिन' :: 1' – galets

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