2012-02-16 14 views
14

पर sockaddr क्यों डाल सकते हैं मैं देख सकता हूं कि sockaddr से sockaddr_in पर कास्ट करना क्यों उपयोगी है, लेकिन मुझे समझ में नहीं आता कि यह कैसे संभव है। जो मैंने पढ़ा है, वे वही आकार हैं और sockaddr_in को sin_zero के साथ समान आकार बनाने के लिए जोड़ा गया है। मैं जानना चाहता हूं कि संकलक कैसे जानता है कि sockaddr_in से जानकारी प्राप्त करने के लिए कहां से sockaddr पर अलग किया गया है।हम sockaddr_in

उत्तर

16

यह संभव है क्योंकि आप आमतौर पर पॉइंटर्स डालें, न कि संरचनाएं स्वयं। आप प्राकृतिक भाषा में क्या करते हैं इसका मतलब है "कृपया इस सूचक को पर internet socket structure पर पॉइंटर के रूप में देखें"। कंपाइलर को सूचक की पुन: व्याख्या करने में कोई समस्या नहीं है। - पहले दो बाइट्स sa_family हैं, और शेष 14 बाइट्स sa_data जो मनमाने ढंग से डेटा है

एक sockaddr आकार में 16 बाइट्स:

यहाँ टिप्पणी से उठाया अधिक विस्तृत वर्णन है। sockaddr_in आकार में 16 बाइट भी है - पहले 2 बाइट sin_family (हमेशा AF_INET) हैं, अगले 2 बाइट sin_port हैं, अगले 4 बाइट sin_addr (आईपी पता) हैं, और अंतिम 8 बाइट sin_zero हैं जो आईपीवी 4 में उपयोग नहीं किया गया है और केवल 16 बाइट सुनिश्चित करने के लिए प्रदान किया जाता है। इस तरह, आप sockaddr.sa_family पहले देख सकते हैं, और यदि यह AF_INET है तो को sockaddr_in के रूप में संपूर्ण sockaddr की व्याख्या करें।

sockaddr_insockaddr.sa_data फ़ील्ड के अंदर संग्रहीत नहीं है। संपूर्ण sockaddr संपूर्ण sockaddr_in है (जब sockaddr.sa_familyAF_INET है, जो है)। यदि आप एक sockaddr* सूचक लेने के लिए और एक sockaddr_in* सूचक को यह डाली है, तो:

  • sockaddr.sa_familysockaddr_in.sin_family
  • बाइट्स sockaddr.sa_data की 0-1 sockaddr_in.sin_port
  • बाइट्स हैं 2-5 कर रहे हैं sockaddr_in.sin_addr
  • बाइट्स 6 -13 sockaddr_in.sin_zero हैं।
+0

यह अजीब लगता है क्योंकि चर कि sockaddr में पता स्टोर करने के लिए माना जाता है जो चार [14] sa_data है, फिर भी sockaddr_in एक अहस्ताक्षरित कम उपयोग करता है। मुझे लगता है कि संकलक चार [14] से बाइट्स की पहली हस्ताक्षरित छोटी संख्या को पढ़ेगा और पता लगाएगा, और शेष char [14] डेटा भेजा जाएगा? इसके अलावा, यदि मैं दो structs के आकार जोड़ता हूं, तो वे एक ही आकार के प्रतीत नहीं होते हैं। sin_zero बहुत बड़ा लगता है। मैं बस यहाँ क्या हो रहा है पाने के लिए कोशिश कर रहा हूँ! –

+11

ए 'सॉकड्रर' आकार में 16 बाइट्स है - पहले दो बाइट 'sa_family' हैं, और शेष 14 बाइट' sa_data' हैं जो मनमाना डेटा है। एक 'sockaddr_in' आकार में 16 बाइट भी है - पहले 2 बाइट' sin_family' (हमेशा 'AF_INET') हैं, अगले 2 बाइट' sin_port' हैं, अगले 4 बाइट 'sin_addr' (आईपी पता) हैं , और अंतिम 8 बाइट 'sin_zero' हैं जो आईपीवी 4 में उपयोग नहीं किया जाता है और केवल 16 बाइट सुनिश्चित करने के लिए प्रदान किया जाता है। इस तरह, आप 'sockaddr.sa_family' पहले देख सकते हैं, और यदि यह' AF_INET' है तो पूरे 'sockaddr' को 'sockaddr_in' के रूप में समझें। –

+6

'sockaddr_in'' sockaddr.sa_data' फ़ील्ड के अंदर संग्रहीत नहीं है। संपूर्ण 'sockaddr' ** ** संपूर्ण' sockaddr_in' है (जब 'sockaddr.sa_family'' AF_INET' है, वह है)। यदि आप 'sockaddr * 'पॉइंटर लेते हैं और इसे' sockaddr_in * 'पॉइंटर पर डाल देते हैं, तो sockaddr.sa_family'' sockaddr_in.sin_family' है, 'sockaddr.sa_data' के बाइट 0-1' sockaddr_in.sin_port', बाइट्स हैं 2-5 'sockaddr_in.sin_addr' हैं, और बाइट्स 6-13' sockaddr_in.sin_zero' हैं। –