2011-08-29 18 views
11

मैं अब के बारे में 5 घंटे के लिए वेब में रेंगने किया गया है और मेरी समस्या के लिए एक समाधान नहीं मिला (फायरवॉल और routers के पीछे):जांच करें कि आईपी लैन में है

मेरी कंपनी एक शैक्षिक खेल विकसित कर रहा है और मैं Monotorrent का उपयोग कर इसके लिए एक autoupdater लिख रहा हूँ। खेल स्कूलों में उपयोग किया जाएगा, लेकिन क्योंकि अधिकांश स्कूलों में केवल बहुत ही कमजोर इंटरनेट कनेक्शन होते हैं, वहां नेटवर्क में केवल एक कंप्यूटर होना चाहिए जो httpseeder से डाउनलोड होता है, और दूसरों को httpseed से डाउनलोड होने वाले कंप्यूटर से लीक होनी चाहिए।

तो मुझे ट्रैकर से आईपी पते का भार मिलता है और LAN में मौजूद केवल फ़िल्टर करने की आवश्यकता होती है।

बेशक स्कूल कभी-कभी फ़ायरवॉल के साथ काफी सख्त होते हैं और स्कूल में कुछ कंप्यूटरों के बीच राउटर और स्विचेस लोड होंगे।

मैं पहले से ही सबसे समाधान, चीजों की कोशिश की है

NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 

    foreach (NetworkInterface iface in interfaces) 
    { 
     IPInterfaceProperties properties = iface.GetIPProperties(); 

     foreach (UnicastIPAddressInformation address in properties.UnicastAddresses) 
     { 
      Console.WriteLine(
       "{0} (Mask: {1})", 
       address.Address, 
       address.IPv4Mask 
       ); 
     } 
    } 

या इसी तरह की तकनीकों की तरह केवल रूटर/स्विच/जो कुछ भी की जानकारी देने के।

तो संक्षेप में, मैं जो करना चाहता हूं वह यह जांचना है कि कोई दिया गया आईपी लैन के माध्यम से सुलभ है या नहीं।

मैं वास्तव में किसी भी मदद क्योंकि इस सुविधा शेष पिछले एक :)

+0

गेम वाले सभी कंप्यूटर आपके इंटरनेट सर्वर से कनेक्ट होते हैं? – Yahia

+2

सीमित उपयोग आईपी पते हैं जो आंतरिक उपयोग, निजी उप जाल के लिए अनुमति है। क्या वह पर्याप्त पहचान नहीं होगी? सार्वजनिक आईपी पते का उपयोग करना बहुत दुर्लभ है और फिर उन्हें फ़ायरवॉल करें, क्योंकि आप आईपीवी 4 पते को बर्बाद नहीं करना चाहते हैं। आईपीवी 6 एक अलग मामला है। – jishi

+0

@ जिशी आप मान रहे हैं कि स्कूलों में नेटवर्क सिफारिशों के अनुसार स्थापित किए गए हैं।हालांकि निजी श्रेणियों की सिफारिश की जाती है, लेकिन सार्वजनिक लोगों का उपयोग करने से आपको रोक नहीं है। –

उत्तर

17

आप टीटीएल का लाभ उठा सकते हैं। तो यहाँ है आप एक के रूप में उपयोग कर सकते हैं (-

private static bool IsLanIP(IPAddress address) 
{ 
    var ping = new Ping(); 
    var rep = ping.Send(address, 100, new byte[] { 1 }, new PingOptions() 
    { 
     DontFragment = true, 
     Ttl = 1 
    }); 
    return rep.Status != IPStatus.TtlExpired && rep.Status != IPStatus.TimedOut && rep.Status != IPStatus.TimeExceeded; 
} 

हालांकि, याद रखें कि यह एक कारण के लिए एक IPv4 मुखौटा कहा जाता है: 1 का टीटीएल के साथ पैकेट इंटरनेट से इसे बनाने के लिए सक्षम नहीं होगा अपने एल्गोरिथम समाधान):

private static bool IsLanIP(IPAddress address) 
{ 
    var interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
    foreach (var iface in interfaces) 
    { 
     var properties = iface.GetIPProperties(); 
     foreach (var ifAddr in properties.UnicastAddresses) 
     { 
      if (ifAddr.IPv4Mask != null && 
       ifAddr.Address.AddressFamily == AddressFamily.InterNetwork && 
       CheckMask(ifAddr.Address, ifAddr.IPv4Mask, address)) 
       return true; 
     } 
    } 
    return false; 
} 

private static bool CheckMask(IPAddress address, IPAddress mask, IPAddress target) 
{ 
    if (mask == null) 
     return false; 

    var ba = address.GetAddressBytes(); 
    var bm = mask.GetAddressBytes(); 
    var bb = target.GetAddressBytes(); 

    if (ba.Length != bm.Length || bm.Length != bb.Length) 
     return false; 

    for (var i = 0; i < ba.Length; i++) 
    { 
     int m = bm[i]; 

     int a = ba[i] & m; 
     int b = bb[i] & m; 

     if (a != b) 
      return false; 
    } 

    return true; 
} 
+0

दूसरा समाधान बहुत काम करने लगता है, हालांकि मुझे टीटीएल-सॉल्यूशन के बारे में निश्चित नहीं है, अगर मैं गलत हूं तो मुझे सही करें (मुझे सच में यकीन नहीं है) लेकिन स्थानीय लोगों द्वारा पारित होने पर टीटीएल भी कम नहीं हुआ है स्विच या राउटर? क्योंकि यदि ऐसा है, तो यह स्थानीय स्विच के पीछे नहीं होगा? – Squirrel

+0

@ स्क्वायरल जहां तक ​​मुझे पता है कि राउटर (स्विच या हब नहीं) पास करते समय केवल कमी हो जाती है; और एक लैन में केवल एक राउटर होना चाहिए। हालांकि, मास्क समाधान कम से कम झूठे परिणाम देने की संभावना है। –

+0

बस यह जांचना कि आईपी एक ही "लैन" में है या नहीं, वास्तव में यह बताता है कि आप लैन पर हैं या यदि आपके पास आईएसपी है जो आपको आईपी-एड्रेस पेश करता है। आप एक सार्वजनिक आईपी के साथ एक/24 या यहां तक ​​कि एक/22 नेट का हिस्सा हो सकते हैं, तो आप एक लैन पर "नहीं" हैं, बस एक ही आईएसपी। – jishi

1

आमतौर 10.xxx (कक्षा ए) या 192.xxx (कक्षा सी) की तरह किसी भी आईपी है कि सराहना करेंगे सुरक्षित रूप से माना जा सकता है एक निजी स्थानीय क्षेत्र नेटवर्क के अंदर। IP Classications

+6

मान लीजिए जाने के लिए वास्तव में एक गरीब रास्ता। उपयोगकर्ता बेवकूफ हैं, वे पागल सामान के सभी रूप करते हैं। –

+2

@Jonathan एक उपयोगकर्ता के रूप में, मुझे नाराज है। एक डेवलपर के रूप में, मैं सहमत हूं। – Rotem

1

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

एक तकनीक जो दिमाग में आती है वह एसएसडीपी (http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol) है जो आपके उद्देश्य को बहुत अच्छा मानती है। इस तरह आपको वास्तव में यह पता लगाने की ज़रूरत नहीं है कि आप लैन पर हैं या नहीं, बस सक्रिय रूप से डाउनलोड करने वाले किसी अन्य नोड की खोज करें, यदि आप कोई नहीं ढूंढ पा रहे हैं, तो स्वयं को डाउनलोड करना प्रारंभ करें।

चूंकि एसएसडीपी यूपीएनपी में उपयोग किया जाने वाला मानक है, इसलिए आप संभवतः सभ्य कार्यान्वयन ढूंढ पाएंगे जिनके साथ आप काम कर सकते हैं।

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