पर sockaddr क्यों डाल सकते हैं मैं देख सकता हूं कि sockaddr
से sockaddr_in
पर कास्ट करना क्यों उपयोगी है, लेकिन मुझे समझ में नहीं आता कि यह कैसे संभव है। जो मैंने पढ़ा है, वे वही आकार हैं और sockaddr_in
को sin_zero
के साथ समान आकार बनाने के लिए जोड़ा गया है। मैं जानना चाहता हूं कि संकलक कैसे जानता है कि sockaddr_in
से जानकारी प्राप्त करने के लिए कहां से sockaddr
पर अलग किया गया है।हम sockaddr_in
उत्तर
यह संभव है क्योंकि आप आमतौर पर पॉइंटर्स डालें, न कि संरचनाएं स्वयं। आप प्राकृतिक भाषा में क्या करते हैं इसका मतलब है "कृपया इस सूचक को पर 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_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-1sockaddr_in.sin_port
- बाइट्स हैं 2-5 कर रहे हैं
sockaddr_in.sin_addr
- बाइट्स 6 -13
sockaddr_in.sin_zero
हैं।
- 1. सी ++ - SOCKADDR_IN
- 2. sockaddr_in undeclared पहचानकर्ता
- 3. हम फाइबर
- 4. हम ली
- 5. हम WCF
- 6. हम एनोटेशन
- 7. हम एंड्रॉइड
- 8. हम MSBuild
- 9. हम एंड्रॉइड
- 10. हम EXEC
- 11. हम वसंत
- 12. हम MYSQL
- 13. हम Winform
- 14. हम एएनटीएलआर
- 15. हम एमुलेटर
- 16. हम JQuery
- 17. हम एनएसएमयूटेबलडाटा
- 18. हम लेमर
- 19. हम तीन.जेएस
- 20. हम जूमला
- 21. आप sockaddr संरचना को sockaddr_in में कैसे डालते हैं - सी ++ नेटवर्किंग सॉकेट्स ubuntu UDP
- 22. क्या हम MSBuild
- 23. जब हम अब
- 24. हम नेविगेशन बार
- 25. हम कैसे स्विंग
- 26. जावास्क्रिप्ट जब हम क्रोम
- 27. हम लॉक.लॉक और लॉक.लॉक
- 28. क्या हम एचटीएमएल 5
- 29. हम स्थिति और विभाजक
- 30. जब हम UISearchBar
यह अजीब लगता है क्योंकि चर कि sockaddr में पता स्टोर करने के लिए माना जाता है जो चार [14] sa_data है, फिर भी sockaddr_in एक अहस्ताक्षरित कम उपयोग करता है। मुझे लगता है कि संकलक चार [14] से बाइट्स की पहली हस्ताक्षरित छोटी संख्या को पढ़ेगा और पता लगाएगा, और शेष char [14] डेटा भेजा जाएगा? इसके अलावा, यदि मैं दो structs के आकार जोड़ता हूं, तो वे एक ही आकार के प्रतीत नहीं होते हैं। sin_zero बहुत बड़ा लगता है। मैं बस यहाँ क्या हो रहा है पाने के लिए कोशिश कर रहा हूँ! –
ए 'सॉकड्रर' आकार में 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' के रूप में समझें। –
'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' हैं। –