2011-02-11 12 views
11

पर पोर्ट का उपयोग करके मैं IPAddress.Parse का उपयोग कर एक आईपी पता और एक पोर्ट युक्त स्ट्रिंग को पार्स करने का प्रयास कर रहा हूं। यह आईपीवी 6 पते के साथ अच्छी तरह से काम करता है लेकिन आईपीवी 4 पते के साथ नहीं। क्या कोई समझा सकता है कि ऐसा क्यों होता है?IPAddress.Parse() IPv4

कोड मैं का उपयोग कर रहा है:

IPAddress.Parse("[::1]:5"); //Valid 
IPAddress.Parse("127.0.0.1:5"); //null 
+0

यहां मुझे दूसरे उदाहरण के लिए शून्य नहीं मिला है। मुझे अपवाद मिलता है। एक आईपीवी 4 पते में पोर्ट नंबर शामिल नहीं हैं। ध्यान दें कि आप "एक आईपी पता * और * एक पोर्ट" वाली स्ट्रिंग को पार्स करने का प्रयास कर रहे हैं। तो अपवाद समझ में आता है। आईपीवी 6 संस्करण क्यों काम करता है, मुझे नहीं पता। –

+4

'आईपीएड्रेस। पर्स (" [:: 1]: 5 ");' मान्य है, * लेकिन * '5' चुपचाप गिरा दिया गया है! यदि आप परिणामी वस्तु का निरीक्षण करते हैं, तो आप देख सकते हैं कि परिणाम केवल ':: 1' है। यह वास्तव में 'IPAddress.Parse' विधि में एक बग हो सकता है ... – hangy

+0

@ मार्टिन्हो फर्नांडीस - यह आईपी 6 पार्सर में एक बग नहीं है, [:: 1]: 5 एक वैध आईपी 6 पता है क्योंकि विभाजक ':' है , '::' नहीं (http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-4) - ** और ** पोर्ट्स को संयोजित करना आईपी 6 में बनाया गया है कल्पना भी, हालांकि आईपीएड्रेस इकाई को * पोर्ट * रखने की उम्मीद नहीं है। यह संभव है कि [ए, बी, सी, डी]: आईपी 6 के लिए बंदरगाह भी अनुमति है क्योंकि आईपी 6 स्पेक का सुझाव है कि यह आईपी 4 स्पेक –

उत्तर

5

IPAddress.Parse एक स्ट्रिंग है कि आईपीवी 4 के लिए और IPv6 के लिए बृहदान्त्र-हेक्साडेसिमल नोटेशन में डॉटेड-ट्रैक्टर अंकन में एक आईपी पता होता है लेने के लिए के लिए है। तो आपका पहला उदाहरण आईपीवी 6 के लिए काम करता है और आपका दूसरा उदाहरण विफल रहता है क्योंकि यह आईपीवी 4 के लिए पोर्ट का समर्थन नहीं करता है। लिंक http://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx

9

ऐसा इसलिए होता है क्योंकि पोर्ट आईपी पते का हिस्सा नहीं है। यह टीसीपी/यूडीपी से संबंधित है, और आपको इसे पहले बाहर करना होगा। इसके लिए उरी कक्षा सहायक हो सकती है।

+0

+1 क्योंकि यह प्रश्न 'क्यों?' का उत्तर देता है। @ फ्रांसिस्को सिल्वा - और फिर आप –

6

आईपीएड्रेस आईपी + पोर्ट नहीं है। आप आईपीईंडपॉइंट चाहते हैं।

उदाहरण से http://www.java2s.com/Code/CSharp/Network/ParseHostString.htm

public static void ParseHostString(string hostString, ref string hostName, ref int port) 
{ 
    hostName = hostString; 
    if (hostString.Contains(":")) 
    { 
     string[] hostParts = hostString.Split(':'); 

     if (hostParts.Length == 2) 
     { 
     hostName = hostParts[0]; 
     int.TryParse(hostParts[1], out port); 
     } 
    } 
}

संपादित करें: ठीक है, मैं मानता हूँ कि सबसे सुरुचिपूर्ण समाधान नहीं था। इसके बजाय मैंने लिखा है (केवल आपके लिए):

// You need to include some usings: 
using System.Text.RegularExpressions; 
using System.Net; 

// Then this code (static is not required): 
private static Regex hostPortMatch = new Regex(@"^(?<ip>(?:\[[\da-fA-F:]+\])|(?:\d{1,3}\.){3}\d{1,3})(?::(?<port>\d+))?$", System.Text.RegularExpressions.RegexOptions.Compiled); 
public static IPEndPoint ParseHostPort(string hostPort) 
{ 
    Match match = hostPortMatch.Match(hostPort); 
    if (!match.Success) 
     return null; 

    return new IPEndPoint(IPAddress.Parse(match.Groups["ip"].Value), int.Parse(match.Groups["port"].Value)); 
}

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

+0

को संभालने के तरीके के लिए @abatischev या @Tedds जवाब देख सकते हैं, आपके प्रयास के लिए धन्यवाद, लेकिन मैं उरी कक्षा का उपयोग कर अपनी समस्या के समाधान के साथ पहले ही समाधान कर चुका हूं। मैं सिर्फ इतना ही चिंतित था कि क्यों आईपीएड्रेस का व्यवहार। इन दो स्थितियों में पर्स। –

+0

आपका दूसरा कोड उदाहरण है RegEx सबसे बुनियादी अंतराल से मेल नहीं खाता है, '127.0.0.1: 80'। – Kehlan

19
Uri url; 
IPAddress ip; 
if (Uri.TryCreate(String.Format("http://{0}", "127.0.0.1:5"), UriKind.Absolute, out url) && 
    IPAddress.TryParse(url.Host, out ip)) 
{ 
    IPEndPoint endPoint = new IPEndPoint(ip, url.Port); 
} 
+1

दूसरों को ध्यान दें यह आईपीवी 6 के साथ काम नहीं करता है [] जैसे ':: 1: 1024' – NiKiZe

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