2011-05-17 11 views
7

मैं नेटवर्क अनुप्रयोग विकसित करना और सॉकेट एपीआई का उपयोग करना।नेटवर्क बाइट ऑर्डर करने के लिए sockaddr_in6 :: sin6_addr बाइट ऑर्डर कैसे सेट करें?

मैं sockaddr_in6 संरचना के sin6_addr बाइट ऑर्डर को सेट करना चाहता हूं।

16 बिट या 32 बिट चर के लिए, यह आसान है: का प्रयोग htons या htonl:

:

// IPv4 
sockaddr_in addr; 
addr.sin_port = htons(123); 
addr.sin_addr.s_addr = htonl(123456); 

लेकिन 128 बिट चर के लिए, मुझे पता है कि बाइट क्रम बाइट क्रम नेटवर्क स्थापित करने के लिए न

// IPv6 
sockaddr_in6 addr; 
addr.sin6_port = htons(123); 
addr.sin6_addr.s6_addr = ??? // 16 bytes with network byte order but how to set? 

कुछ उत्तर 8 बार (2 * 8 = 16 बाइट्स) के लिए htons का उपयोग कर सकते हैं, या 4 बार (4 * 4 = 16 बाइट्स) के लिए htonl का उपयोग कर सकते हैं, लेकिन मुझे नहीं पता कि कौन सा तरीका सही है।

धन्यवाद।

उत्तर

9

रूप struct in6_addr की s6_addr सदस्य परिभाषित किया गया है:

uint8_t s6_addr[16]; 

यह uint8_t की एक सरणी है के बाद से, बजाय एक एकल 128 बिट पूर्णांक प्रकार किया जा रहा से, endianness के मुद्दे ही नहीं उठता: आप बस कॉपी गंतव्य के लिए आपके स्रोत uint8_t [16] सरणी से। उदाहरण के लिए, 2001:888:0:2:0:0:0:2 पते में प्रतिलिपि बनाने के लिए आप उपयोग करेंगे:

static const uint8_t myaddr[16] = { 0x20, 0x01, 0x08, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; 

memcpy(addr.sin6_addr.s6_addr, myaddr, sizeof myaddr); 
1

सामान्य बात मेजबाननाम लुकअप दिनचर्या में से एक का उपयोग करना होगा और इसके परिणाम का उपयोग करना होगा, जो पहले से ही नेटवर्क बाइट ऑर्डर में है। आप हार्डकोडेड न्यूमेरिक आईपी पते से कैसे निपट रहे हैं?

+0

ईमानदारी से, मैं एक पुस्तकालय विकसित करता हूं। होस्टनाम तक पहुंचने के लिए कुछ सीमाएं हैं। –

+0

@ एमीर सनीयान क्या सीमाएं? पूरा इंटरनेट आईपी पते की बजाय होस्टनाम का उपयोग करता है, और बाद वाले को DNS नामक डेटाबेस में प्रतिनिधि करता है। आपकी स्थिति के बारे में क्या अलग है? किसी भी मामले में आपको बस इतना करना है कि आईपी एड्रेस को ऑक्टेट्स में स्टोर करें, यानी बाइट्स, वही ऑर्डर जैसे आप उन्हें लिखेंगे, और काम पूरा हो जाएगा। – EJP

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