2010-01-11 13 views
8

में कनवर्ट करने में समस्या मेरे पास एएसपीनेट ऐप में कुछ कोड है जिसे क्लाइंट कंप्यूटर के आईपीवी 4 एड्रेस प्राप्त करने की ज़रूरत है (उपयोगकर्ता सभी अपने नेटवर्क पर हैं)। हाल ही में हमने उस सर्वर को अपग्रेड किया है जिस पर ऐप विंडोज 2008 सर्वर पर चलता है। अब Request.UserHostAddress कोड ipv4 देता है जब क्लाइंट पुराने ओएस और ipv6 पर होता है जब वे एक नए ओएस (Vista और उच्चतर) पर होते हैं। तो यह सुविधा जो कुछ ग्राहकों के लिए काम करती है, न कि दूसरों के लिए।आईपीवी 6 को आईपीवी 4

मैंने इस समस्या को ठीक करने का प्रयास करने के लिए ipv6 से ipv4 में कनवर्ट करने वाला कोड जोड़ा है। यह इस ऑनलाइन ट्यूटोरियल से है: http://www.4guysfromrolla.com/articles/071807-1.aspx .मैं dsn.GetHostAddress का उपयोग कर और फिर यह है कि यह मेरे लिए काम नहीं कर रहा पाशन के माध्यम से आईपी एक है कि है "इंटर"

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress)) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

if (IP4Address != String.Empty) 
{ 
    return IP4Address; 
} 


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 
{ 
    if (IPA.AddressFamily.ToString() == "InterNetwork") 
    { 
     IP4Address = IPA.ToString(); 
     break; 
    } 
} 

return IP4Address; 

समस्या की तलाश में लौट आए। आईपीवी 4 से कनेक्ट करने वाले क्लाइंट क्लाइंट कंप्यूटर के सही आईपीवी 4 आईपी को वापस लौटते रहते हैं, लेकिन विस्टा और विंडोज 7 से कनेक्ट होने वाले क्लाइंट सर्वर के आईपीवी 4 आईपी को वापस कर रहे हैं SERVER मशीन क्लाइंट कंप्यूटर नहीं।

+8

मैंने कई नमूने पर इस नमूना कोड को दोहराया है। मैं आश्चर्यचकित हूं क्योंकि यह बहुत गलत है .. भाग 1, ग्राहक का आईपी पता प्राप्त करें। यदि यह विफल रहता है, तो सर्वर का आईपी पता वापस कर दें। WTF?!? –

+4

हां, बस वही उदाहरण यहां मिला: http://www.4guysfromrolla.com/articles/071807-1.aspx। यदि कुछ और नहीं है, तो एनम समानता की जांच के लिए 'ToString() 'का उपयोग करके ऐसा लगता है कि यह कुल .NET नौसिखिया द्वारा लिखा गया था। – Groo

उत्तर

7

सरल उत्तर: सर्वर पर आईपीवी 6 अक्षम करें, या DNS प्रविष्टि से सर्वर के आईपीवी 6 पते को हटा दें।

कोई जादू आईपीवी 4 < -> आईपीवी 6 कनवर्टर नहीं है। वे पूरी तरह से अलग प्रोटोकॉल हैं, और एक में पते दूसरे में अनुवाद नहीं करते हैं। यदि आप क्लाइंट के आईपीवी 4 पते को विश्वसनीय रूप से पुनर्प्राप्त करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि क्लाइंट आईपीवी 4 से कनेक्ट हो।

+6

और निश्चित रूप से स्पष्ट सलाह: आईपीवी 6 आ रहा है, अपने सॉफ्टवेयर को ठीक से निपटने के लिए तैयार करें। आईपीवी 4 पते पर निर्भर आपको चोट पहुंचाने जा रहा है। –

1

यदि आप .NET 4.5 फ़्रेमवर्क फिर वहाँ एक तरीका प्रदान किया जाता है का उपयोग कर रहे IP4

को ip6 कन्वर्ट करने के लिए
public IPAddress MapToIPv4() 

आप विवरण here

+4

यह विधि केवल आईपीवी 6 पतों पर उपयोग करने के लिए समझ में आता है जो पहले स्थान पर आईपीवी 4 पते मैप करके प्राप्त किए गए हैं। जैसा कि जेसी वीगर्ट कहते हैं, कोई जादू v6 -> v4 कनवर्टर नहीं है। – AakashM

6

मैं भी उदाहरण कोड और एक सहयोगी नकल की थी पा सकते हैं ध्यान दिया कि यह स्पष्ट रूप से छोटी गाड़ी थी। इस लाइन सर्वर का होस्ट नाम का उपयोग करता है, इसलिए गलत परिणाम:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) 

इस प्रकार मैं अपने प्रोजेक्ट में कोड को सही है:

/// <summary> 
/// Returns the IPv4 address of the specified host name or IP address. 
/// </summary> 
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param> 
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns> 
public static string GetIPv4Address(string sHostNameOrAddress) 
{ 
    try 
    { 
    // Get the list of IP addresses for the specified host 
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress); 

    // First try to find a real IPV4 address in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
     return ipHost.ToString(); 

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list 
    foreach (IPAddress ipHost in aIPHostAddresses) 
    if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) 
     { 
     IPHostEntry ihe = Dns.GetHostEntry(ipHost); 
     foreach (IPAddress ipEntry in ihe.AddressList) 
      if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      return ipEntry.ToString(); 
     } 
    } 
    catch (Exception ex) 
    { 
    System.Diagnostics.Trace.WriteLine(ex); 
    } 
    return null; 
} 

कोड ऊपर ASP.Net 2.0 में काम करता है विंडोज 7/सर्वर 2008 पर। उम्मीद है कि यह मदद करता है।

+0

ब्रैकेट के प्रशंसक नहीं? :) – Evorlor

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