2009-08-08 18 views
7

मैं वर्तमान में सॉकेट से जुड़े एक प्रोजेक्ट के बीच में हूं, और मैं सिर्फ लिनक्स की sys/socket.h फ़ाइल का उपयोग करता हूं। माइक्रोसॉफ्ट के लिए पोर्ट क्यू, और यह महसूस कर रहा है कि विंसॉक अलग है। मुझे लगता है कि मेरे पास दो प्रश्न हैं।माइक्रोसॉफ्ट ने सॉकेट को अलग-अलग क्यों लागू किया?

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

दूसरा, माइक्रोसॉफ्ट ने ऐसा क्यों किया? उनकी प्रेरणा क्या थी? वे सिर्फ हर किसी के समान कार्यान्वयन क्यों नहीं रखते थे?

+1

एक अन * "अनुवाद" करने के लिए Windows के लिए x तरीका है - http://apr.apache.org/docs/apr/1.3/group__apr__network__io.html –

उत्तर

12

अगर मुझे बिंदु याद आया है तो मुझे माफ़ कर दो, लेकिन क्या आप WSARecv और परिवार को देख रहे हैं, और सोच रहे हैं कि विंडोज पर पूरे सॉकेट एपीआई बर्कले सॉकेट एपीआई से अलग है?

बर्कले एपीआई विंडोज पर मौजूद है (recv और परिवार देखें) और यह किसी भी अन्य बर्कले सॉकेट कार्यान्वयन के साथ काफी हद तक संगत है।

विंडोज़ को सॉकेट कोड पोर्ट करने के बारे में जानकारी के लिए एमएसडीएन आलेख "Porting Socket Applications to Winsock" देखें।

+0

अरे नहीं, मुझे नहीं लगता था कि पूरे एपीआई अलग था। अन्यथा, विंडोज कंप्यूटर * निक्स कंप्यूटर के साथ संवाद कैसे करेगा? लेकिन मैं बस सोच रहा था कि सिंटैक्स अलग क्यों था। –

+1

@ एंड्रयू: "सोच रहा है कि सिंटैक्स क्यों अलग था": मेरा मुद्दा यह है कि सिंटैक्स * अलग नहीं है - वही बर्कले सॉकेट एपीआई जो आप लिनक्स पर उपयोग कर रहे हैं वह विंडोज पर भी उपलब्ध है। या क्या हम पार प्रयोजनों पर बात कर रहे हैं? क्या आपके पास वाक्य का उदाहरण अलग-अलग उदाहरण है? – RichieHindle

0

ACE का उपयोग करने का प्रयास करें - यह एक महान क्रॉस प्लेटफार्म संचार पुस्तकालय है।

0

मिलन ने टिप्पणी में कहा, लेकिन Apache Portable Runtime लाइब्रेरी नेटवर्क किए गए एप्लिकेशन के लिए पोर्टेबिलिटी मुद्दों में से कई को कवर करती है।

16

Winsock Programmer's FAQ इस पर एक अनुभाग है, BSD Sockets Compatibility। (प्रकटीकरण: मैं अकसर किये गए सवाल के मेंटेनर हूँ।)

मैं वास्तव में whys और उस लेख में wherefores को कवर नहीं किया, इसलिए:

  • बनाम sys/socket.h, ARPA winsock.h /inet.h, netinet/in.h, आदि: यह वास्तव में एक सुधार मिलता है। यह कार्यक्षमता का एक तंग सेट है, तो एक ही शीर्षलेख में इसके लिए सभी परिभाषाएं क्यों नहीं हैं?

  • पास() बनाम closesocket(): विंडोज 3 दिनों में वापस जब विनसॉक आविष्कार किया गया था, विंडोज सी ++ compilers सभी POSIX एपीआई आवरण किसी तरह का पोर्टेबिलिटी के कुछ बुनियादी स्तर प्रदान करने के लिए, बंद सहित था() । इन्हें बस कंपाइलर के स्टडीओ कार्यान्वयन में बुलाया गया, क्योंकि डॉस और विन 16 में यूनिसेज की तरह एकीकृत आई/ओ तंत्र नहीं था। आप Win16 में केवल एक वर्णक पर क्लोज़() को कॉल नहीं कर सकते हैं और यह स्वतंत्र है कि यह फ़ाइल, सॉकेट, पाइप, चाहे जो भी हो। Win32 एक ही समय में अस्तित्व में था क्योंकि विंसॉक का आविष्कार एनटी 3.5 के हिस्से के रूप में किया जा रहा था, और यह इसे ठीक करता है, लेकिन केवल एनटी डेरिवेटिव्स पर उपलब्ध विंसॉक को विंडोज एक्सपी तक इंटरनेट पर एमएस अप्रासंगिक बना दिया होगा। एमएस खेल के लिए धीमा हो सकता है, लेकिन नहीं है कि धीमी है। नीचे की रेखा, बीएसडी सॉकेट में कुछ भी जो POSIX तंत्र का उपयोग करता है जो सी ++ कंपाइलर्स द्वारा प्रदान किए गए मौजूदा एपीआई से विवादित है जो इसे लक्षित करता है, केवल विंसॉक में नहीं हो सकता है। उन्हें एक ही कार्यक्षमता को एक नया नाम देना पड़ा।

  • डब्लूएसए *(): यह केवल कार्यक्षमता प्रदान करता है, जो कार्यक्षमता प्रदान करता है जो बीएसडी सॉकेट नहीं करता है। इसमें से बहुत कुछ वास्तव में अच्छा है, और सभी इकाइयों में समान तंत्र देखना अच्छा लगेगा, लेकिन यह जल्द ही कभी नहीं होने वाला है। प्रतिस्पर्धात्मक तंत्र हैं, जैसे aio *(), लेकिन यह सभी इकाइयों में उपलब्ध नहीं है, जो विंडोज के लिए बहुत कम पोर्टेबल है।आप इसे अनदेखा कर सकते हैं और बेस सॉकेट एपीआई से चिपके रह सकते हैं, हालांकि विंडोज़ पर पोर्ट करते समय यह हमेशा सबसे अच्छा विकल्प नहीं होता है।

  • त्रुटि बनाम WSAGetLastError(): errno मानक सी का हिस्सा है, लेकिन त्रुटि मान सी कार्यान्वयन तक हैं। ध्यान रखें कि शुरुआत में विंसॉक माइक्रोसॉफ्ट-विशिष्ट चीज नहीं था। डॉस और विंडोज मानक नेटवर्क एपीआई होने से शुरू नहीं हुआ था। यह तृतीय पक्षों द्वारा प्रदान किया गया था, जो सभी एक साथ हो गए और माइक्रोसॉफ्ट के साथ विंसॉक का आविष्कार किया। शुरुआती विंसॉक स्टैक सभी तीसरे पक्ष थे। वे कई कारणों से सी आरटीएल के गलत मूल्य को ओवरराइट करने के लिए स्पेस नहीं लिख सके। ये त्रुटि मान विक्रेता द्वारा प्रदत्त winsock.dll, सी आरटीएल से एक पूरी दुनिया से संबंधित थे।

  • WSAStartup(), WSACleanup(): फिर इस तथ्य यह है कि winsock.dll शुरू में एक तीसरे पक्ष बात प्रदान की है, जो कुछ अंतर्निहित नेटवर्क ढेर है कि ओएस का हिस्सा नहीं है के साथ interfaced था की वजह से है । इसके अलावा, चीजों के Win16 पहलू हैं: Win16 यह नहीं देख सका कि एक प्रोग्राम अभी मर गया है और अपने आवंटित संसाधनों को स्वचालित रूप से साफ कर सकता है। प्रोग्राम से बाहर निकलने से पहले आपको सबकुछ स्पष्ट रूप से रिलीज़ करना था, या वे लीक हो जाएंगे।

  • रीडव(), आदि की कमी: यह तीसरे पक्ष/विन 16 दुनिया में समझ में नहीं आया जहां विंसॉक का जन्म हुआ था।

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