नेटवर्क कॉल के बीच अंतर विंडोज और लिनक्स कहते हैं

छवि
बर्कले और माइक्रोसॉफ्ट से सॉकेट मॉडल, जो कई मायनों में स्रोत कोड स्तर पर संगत हैं, व्यवहार में इतना क्रॉस-प्लेटफॉर्म नहीं है।

आइए उनके कार्यान्वयन में कुछ मुश्किल अंतरों को देखें, जो कि एक ओएस में एक प्रक्रिया से दूसरे ओएस में एक प्रक्रिया के पुनर्निर्देशित नेटवर्क कॉल को क्रॉस-प्लेटफॉर्म आरपीसी लिखते समय पाए गए थे।


सॉकेट प्रकार

जब तक प्रोसेसर की क्षमता 32 बिट्स होती है, तब तक इंटरचेंज के साथ कोई समस्या नहीं होती है। विंडोज में 64 बिट्स पर, SOCKET प्रकार आकार में 2 गुना बड़ा है।

बीएसडी सॉकेट डिस्क्रिप्टर फ़ाइल डिस्क्रिप्टर से अलग नहीं है, जिसका अर्थ है कि कुछ सिस्टम कॉल एक साथ सॉकेट और फ़ाइलों दोनों के डिस्क्रिप्टर द्वारा स्वीकार किए जाते हैं (उदाहरण के लिए, जैसे "शायद ही कभी" कॉल जैसे करीबी (), fcntl () और ioctl ())।
एक साइड इफ़ेक्ट भी है जो न केवल विकट परिस्थितियों में प्रकट होता है, अर्थात् बर्कले मॉडल का समर्थन करने वाले सिस्टम पर सॉकेट डिस्क्रिप्टर का संख्यात्मक मान आमतौर पर एक छोटी संख्या (100 से कम) होता है, और क्रमिक रूप से बनाए गए डिस्क्रिप्टर 1. भिन्न भिन्न होते हैं। Microsoft मॉडल में, ऐसा डिस्क्रिप्टर तुरंत 200 से अधिक (लगभग), और क्रमिक रूप से निर्मित वर्णनकर्ता आकार (सॉकेट) द्वारा भिन्न होते हैं।


हैंडलिंग में त्रुटि

Errno स्थिरांक और विंडोज त्रुटि कोड पूरी तरह से अलग अर्थ हैं।


सॉकेट्स बनाना:

सॉकेट (इंट अफ, इंट प्रकार, इंट प्रोटोकॉल);

पहले तर्क के लिए स्थिरांक का बीएसडी और विंडोज पर पूरी तरह से अलग अर्थ है। दूसरे के लिए, वे अभी भी समान हैं।


सॉकेट कॉन्फ़िगर करें

दूसरे और तीसरे तर्क के लिए ध्वज स्थिरांक का बीएसडी और विंडोज पर पूरी तरह से अलग अर्थ है।


सॉकेट्स को कॉन्फ़िगर करें 2

एकमात्र पूरी तरह से सही मैपिंग: fcntl (डिस्क्रिप्टर, F_SETFL, O_NONBLOCK) -> ioctlsocket (डिस्क्रिप्टर, FIONBIO, मान O_NBLBLOCK के साथ चर का पता)। झंडे के संख्यात्मक मूल्यों को लक्ष्य प्रणाली के सापेक्ष समझा जाना चाहिए (वे बीएसडी और विंडोज पर अलग हैं)।
उसी समय, fcntl (डिस्क्रिप्टर, F_GETFL) जैसी क्वेरी 0 या O_RRWR वापस कर सकती है।


कॉन्फ़िगर करें सॉकेट 3

पहले तर्क के रूप में सॉकेट के साथ ioctl () के वास्तविक उपयोग के मामलों की अभी तक पहचान नहीं की गई है।


डीएनएस के साथ काम करें

getaddrinfo (चार कांस्ट * नोड, चार कांस्ट * सर्विस, स्ट्रक्चर एड्रीनो कॉन्स * संकेत, स्ट्रक्चर एड्रीनो ** ब्लर)

इन संरचनाओं के आक्रमणकारियों को ध्यान से देखें। ai_addr और ai_canonname की संरचना की शुरुआत के सापेक्ष अलग-अलग ऑफसेट हैं। डेवलपर्स ने बस उन्हें स्वैप किया (मिश्रित किया?)।


डेटा अग्रेषण

चौथे तर्क के झंडे बीएसडी और विंडोज पर पूरी तरह से अलग अर्थ हैं।


संचालन की प्रतीक्षा में

पोलड संरचना के दूसरे और तीसरे आक्रमणकारियों के लिए ध्वज स्थिरांक का बीएसडी और विंडोज पर पूरी तरह से अलग मूल्य है। WSAPoll () केवल विंडोज 6 वें संस्करण (विस्टा) और बाद में उपलब्ध है।


संचालन की प्रतीक्षा में २

चयन में एक समस्या तब होती है जब fd_set संरचना मैप की जाती है। याद रखें कि कैसे () काम करता है। यह कॉल सॉकेट्स के तीन सेटों को स्वीकार करता है: कुछ समय के लिए पढ़ने, लिखने और त्रुटियों की जाँच के लिए। आप मैक्रो FD_SET (सॉकेट, सेट) द्वारा इनमें से किसी एक सेट के सत्यापन के लिए अपना सॉकेट जोड़ सकते हैं, स्थिरता की जांच कर सकते हैं - FD_ISSET (सॉकेट, सेट), सेट से एक सॉकेट हटाएं - FD_CLR (सॉकेट, सेट), सब कुछ हटाएं - FD_ZERO (सेट) । कॉल के बाद, चयन () इसी सेट में छोड़ देता है केवल उन सॉकेट्स, जो अंतिम तर्क द्वारा निर्दिष्ट टाइमआउट के दौरान, अपेक्षित स्थिति प्राप्त कर चुके हैं।

एक बीएसडी के लिए, एक सॉकेट को एक सेट में डालने से अंतिम बिट में लंडिंग होती है जैसे कि उसका सीरियल नंबर संख्यात्मक विवरणकर्ता के बराबर होता है। FD_SETSIZE आमतौर पर 1024 है। चयन करने के लिए पहला तर्क () तीन सेटों में से किसी एक में सॉकेट डिस्क्रिप्टर का अधिकतम संख्यात्मक मान है। यह देखते हुए कि fds_bits सरणी में थोड़ी सी सेटिंग को विशेष रूप से सीमा की जांच किए बिना किया जाता है, यह स्पष्ट हो जाता है कि सॉकेट विवरणक मूल्य> = FD_SETSIZE के साथ, प्रोग्राम व्यवहार अपरिभाषित है। इस तरह के चयन के कुछ अविश्वसनीय कार्यान्वयन कंजूस कंप्यूटर का एक अवशेष है। वैसे, यहाँ किस स्थिति में int -> SOCKET और इसके विपरीत का अप्रत्यक्ष रूपांतरण महत्वपूर्ण है।

विंडोज के लिए, कुछ सेट में एक सॉकेट डालकर fd_cray एरे में fd_count इंडेक्स में डालना और बाद में इसे बढ़ाना शामिल है। FD_SETSIZE आमतौर पर 64 है। हालांकि, पहले तर्क () का चयन करने के लिए पूरी तरह से नजरअंदाज कर दिया जाता है।

Source: https://habr.com/ru/post/In105918/


All Articles