2010-02-26 12 views
20

वर्षों से मैंने WinSock (रूटर, वेब/मेल/एफ़टीपी सर्वर, आदि ... आदि ...) का उपयोग कर विंडोज के लिए सी ++ सर्वर/क्लाइंट अनुप्रयोगों का एक छोटा सा द्रव्यमान विकसित किया है।आईपीवी 4 से आईपीवी 6 तक सी ++ टीसीपी/आईपी अनुप्रयोगों को परिवर्तित करना। मुश्किल? प्रयास के लायक?

मैं इन अनुप्रयोगों के आईपीवी 6 संस्करण को बनाने के लिए और अधिक से अधिक सोचने शुरू कर रहा हूं (मूल आईपीवी 4 संस्करण को भी बनाए रखने के दौरान)।

सवाल:

  1. क्या नुकसान मैं में आ सकते हैं?
  2. क्या पोर्टिंग/रूपांतरण मुश्किल है?
  3. क्या रूपांतरण इसके लायक है?


एक संदर्भ (या मनोरंजन के लिए) के लिए, आप मेरी अनुप्रयोगों के मूल में IPv4 code के एक चोटी sneek कर सकते हैं।

उत्तर

18

getaddrinfo और getnameinfo आपके मित्र हैं .. जितना संभव हो सके मैं सुझाव देता हूं कि वे मौजूदा एप्लिकेशन में आईपीवी 4 और आईपीवी 6 समर्थन प्रदान करने के लिए आपकी खोज में अपने सबसे अच्छे दोस्त बनें।

यदि आईपीवी 6 समर्थन जोड़कर सही किया जाता है तो आप सिस्टम को उस बिंदु पर सारणीबद्ध करते हैं जहां एक अज्ञात भविष्य आईपी प्रोटोकॉल कोड संशोधन के बिना चलाया जा सकता है।

आम तौर पर जब कनेक्ट करने से आपको एक सॉकेट संरचना, बंदरगाह, पता परिवार, आईपी पता, भरें रूपांतरित पता/बंदरगाहों बाइट क्रम नेटवर्क, आदि

getaddrinfo साथ

आप एक आईपी पता या होस्टनाम और बंदरगाह या भेज बंदरगाह का नाम, और यह संरचनाओं और सीधे socket() और connect() में पारित होने के लिए तैयार सब कुछ के साथ एक लिंक्ड सूची देता है।

getaddrinfo दोनों IP प्रोटोकॉल के साथ काम करने के लिए महत्वपूर्ण है यह जानता है मेजबान IPv6 या IPv4 कनेक्टिविटी है और यदि सहकर्मी जो प्रोटोकॉल (रों) का पता लगा लेता बनाम A रिकॉर्ड DNS AAAA को देखकर रूप में अच्छी तरह से करता है और गतिशील रूप से यह जानता है के रूप में विशिष्ट कनेक्शन अनुरोध सेवा के लिए उपलब्ध हैं।

मैं अत्यधिक inet_pton(), inet_addr() या आईपी संस्करण विशिष्ट हैं जो परिचित उपकरणों के उपयोग के खिलाफ अत्यधिक सलाह देता हूं। विंडोज प्लेटफॉर्म पर विशेष रूप से inet_pton() एमएस विंडोज (एक्सपी, 2003 एट अल।) के पुराने संस्करणों के साथ संगत नहीं है जब तक आप अपना खुद का रोल नहीं करते। आईपीवी 4 और आईपीवी 6 के लिए अलग-अलग संस्करणों के खिलाफ भी सलाह दें ... यह तकनीकी समाधान के रूप में अनावश्यक है क्योंकि निकट भविष्य में दोनों प्रोटोकॉल को एक साथ उपयोग करने की आवश्यकता होगी और लोगों को उपयोग करने के लिए समय से पहले पता नहीं हो सकता है। सॉकेट इंटरफेस सार हैं और आईपीवी 6 सॉकेट बनाने या श्रोताओं के लिए आईपीवी 6 ड्यूलस्टैक सॉकेट विकल्प सेट करने का प्रयास करके दोहरीस्टैक या आईपीवी 6 समर्थन का पता लगाना आसान है। ऐसा कोई कारण नहीं है जिसके परिणामस्वरूप एप्लिकेशन उस सिस्टम पर नहीं चलेगा जो आईपीवी 6 के बारे में समर्थन या जानकारी नहीं देता है।

आउटगोइंग कनेक्शन PF_UNSPECgetaddrinfo में उपयोग करें ताकि आउटगोइंग कनेक्शन बनाते समय पता परिवार आपके लिए चुना जा सके। यह, आईएमएचओ, ड्यूलस्टैक दृष्टिकोण से बेहतर है क्योंकि यह प्लेटफॉर्म को अनुमति देता है जो काम करने के लिए ड्यूलस्टैक का समर्थन नहीं करता है।

आने वाले कनेक्शनों के लिए आप या तो आईपीवी 4/आईपीवी 6 सॉकेट को अलग से बांध सकते हैं यदि डिज़ाइन दिया गया हो या दोहरी स्टैक का उपयोग करें यदि आप अलग श्रोताओं को नहीं कर सकते हैं। डुएलस्टैक getnameinfo का उपयोग करते समय आईपीवी 4 पते के लिए आईपीवी 6 पता देता है जो आईएमएचओ काफी बेकार हो जाता है। एक छोटी उपयोगिता दिनचर्या स्ट्रिंग को सामान्य आईपीवी 4 पते में परिवर्तित कर सकती है।

मेरे अनुभव से सही होने पर आपने विशिष्ट आईपी संस्करणों पर निर्भरताओं को हटा दिया है और शुरू करने से कम सॉकेट प्रबंधन कोड समाप्त कर दिया है।

+1

यह भी ध्यान देने योग्य है कि ये सभी कॉल आमतौर पर विंडोज़, मैक ओएस एक्स और लिनक्स के बीच पोर्टेबल हैं, यहां केवल थोड़ी सी अंतर है। –

2

आईपीवी 6 लागू करने वाली कुछ ओपन सोर्स परियोजनाओं के परिवर्तन लॉग को देखें। इसमें से अधिकांश यूनिक्स कोड है लेकिन विंसॉक बीएसडी सॉकेट के समान है।

एक्ज़िम, कूरियर, स्क्विड, अपाचे, BIND DNS कुछ स्थानों को दिखने लगते हैं।

12

मैंने एक साल पहले अपने पहले आईपीवी 4-केवल networking library में आईपीवी 6 समर्थन जोड़ा, और मुझे यह बहुत मुश्किल या दर्दनाक नहीं मिला। (या आप शरारती, मेरे जैसे हैं, uint32_t के रूप में अगर)

में आईपीवी 4 आप उन्हें sockaddr_in के रूप में की दुकान:

केवल बड़ा अंतर है आप कैसे स्टोर IP पते

के लिए आईपीवी 6 आप उन्हें के (या कुछ बराबर 128 बिट संरचना) के रूप में स्टोर करने के लिए की जरूरत है।

एक अच्छा पूर्व रूपांतरण कदम अपने कोड के माध्यम से जाने के लिए और स्थानों पर जहां आईपीवी 4 पतों वर्तमान में जमा हो जाती है के सभी को खोजने के लिए किया जाएगा, और उन्हें सार बाहर एक सामान्य आईपी पता वर्ग कि बाद में आंतरिक रूप से reimplemented किया जा सकता है में या तो आईपीवी 4 पता या आईपीवी 6 पता
तो यकीन है कि कुछ भी नहीं आईपीवी 4 मोड में टूट गया है बनाने के लिए फिर से परीक्षण ... एक बार है कि बाहर की जाँच की है, तो आप बस कुछ और परिवर्तन (मुख्य रूप से PF_INET6 को PF_INET में बदलाव के साथ आईपीवी 6में स्विच करने के लिए सक्षम होना चाहिए, inet_aton() से inet_pton(), आदि ...)। के रूप में आईपीवी 4-केवल डिफ़ॉल्ट रूप से, लेकिन एक पूर्वप्रक्रमक मैक्रो (-DMUSCLE_USE_IPV6) आईपीवी 6-अवगत मोड में पुन: संयोजित करने के लिए परिभाषित करने के विकल्प के साथ

मेरे अभी भी पुस्तकालय जहाज।
इस तरह से यह अभी भी उन सिस्टम पर संकलित किया जा सकता है जो आईपीवी 6 का समर्थन नहीं करते हैं।रास्ते में मुझे मिली एक बहुत ही उपयोगी सुविधा आईपीवी 4-मैप किए गए आईपीवी 6 पते: इनमें से एक निर्दिष्ट करके (अनिवार्य रूप से 0xFFFF के साथ एक आईपीवी 4 पता) इसके लिए तैयार किया गया है, आपको एक सॉकेट मिलता है जो आईपीवी 4 और आईपीवी 6 दोनों से बात कर सकता है, और इस प्रकार एक सर्वर जो आईपीवी 4 और आईपीवी 6 क्लाइंट्स दोनों के साथ बात कर सकता है, साथ ही, सब कुछ के लिए अलग आईपीवी 4 और आईपीवी 6 कोड पथ लिखने के बिना।

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

+0

धन्यवाद !! निश्चित रूप से लगता है जैसे आप पहले वहाँ रहे हैं !!! – NTDLS

+1

यदि कोई दिलचस्पी लेता है, तो मैंने लिंक अपडेट किया है, क्योंकि इसकी तिथि समाप्त हो गई है –

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