2016-09-12 17 views
7

निम्नलिखित प्रोग्राम और इसके आउटपुट से पता चलता है कि INET_ADDRSTRLEN को 16 और INET_ADDRSTRLEN के रूप में परिभाषित किया गया है 46 के रूप में परिभाषित किया गया है।INET6_ADDRSTRLEN को सी में 46 के रूप में परिभाषित क्यों किया गया है?

यहां कार्यक्रम है।

#include <stdio.h> 
#include <arpa/inet.h> 

int main() 
{ 
    printf("%d\n", INET_ADDRSTRLEN); 
    printf("%d\n", INET6_ADDRSTRLEN); 
    return 0; 
} 

यहां आउटपुट है।

16 
46 

मैं समझ सकता क्यों INET_ADDRSTRLEN जरूरतों 16 किया जाना है। आईपीवी 4 पते का सबसे बड़ा संभव स्ट्रिंग प्रतिनिधित्व 15 बाइट्स का उपभोग करता है, उदा। "255.255.255.255"। इसलिए 16 बाइट्स को इस तरह के एक आईपी पते को अपने निरंतर शून्य चरित्र के साथ स्टोर करने की आवश्यकता होती है।

लेकिन INET6_ADDRSTRLEN क्यों 46 होना चाहिए? आईपीवी 6 पते का सबसे बड़ा संभव स्ट्रिंग प्रतिनिधित्व केवल 39 बाइट्स (मेरे ज्ञान के अनुसार) का उपभोग करता है, उदाहरण के लिए "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"। इसलिए इस तरह के एक आईपी पते को अपने समापन शून्य चरित्र के साथ स्टोर करने के लिए केवल 40 बाइट्स की आवश्यकता होती है।

क्या आईपीवी 6 पते का एक स्ट्रिंग प्रतिनिधित्व है जो 46 बाइट्स का उपभोग कर सकता है?

+0

संबंधित: [आईपीवी 6 पते के पाठपरक प्रतिनिधित्व की अधिकतम लंबाई?] (Http://stackoverflow.com/q/166132/1068283) –

उत्तर

19

क्यों INET6_ADDRSTRLEN 46 के रूप में परिभाषित किया गया है सी में?

क्योंकि POSIX में परिभाषित करता है 46 हो:

INET6_ADDRSTRLEN
46. IPv6 के लिए स्ट्रिंग प्रपत्र की लंबाई।

जबकि आप सही longtest IPv6 पता 39 बाइट्स लेता है कि, आईपीवी 4 सुरंग के साथ कर रहे हैं, सबसे लंबे समय तक प्रपत्र 45 बाइट्स हो सकता है:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255 

और 46 वीं बाइट (समाप्त नुल बाइट के लिए है सी में एक स्ट्रिंग)। यह बताता है कि यह 46 कैसे हुआ।

3

यह शायद फार्म के पतों की आईपीवी 4-मैप की फार्म के लिए है:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255 

और अधिक पढ़ें:

Wireshark-dev mailing list

RFC 4291 section 2.2

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

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