2011-09-21 11 views
5

जो मैं चाहता हूं वह सरल है - नया सी ++/सीएलआई बनाने के कोड नमूना को बढ़ावा देने के लिए सॉकेट .NET सॉकेट। ऐसी चीज कैसे बनाएं?सी ++/सीएलआई .NET सॉकेट में boost :: asio सॉकेट को कैसे चालू करें?

.net::socket a; 
boost::asio::socket b; 
a.assign(b.nativeWin32Socket()); 

Btw::

यहाँ मैं करना चाहते हैं क्या की छद्म कोड है यहाँ है कैसे करने के लिए turn C++/CLI .Net socket into boost::asio socket.

+0

कोई विकल्प नहीं, एक कन्स्ट्रक्टर जो (लपेटा हुआ) सॉकेट हैंडल लेता है वह निजी है। –

+2

@ हंसपैसेंट: हाँ, लेकिन [यह एक] (http://msdn.microsoft.com/en-us/library/ms145125.aspx) सार्वजनिक है। चेतावनी: बैटरी शामिल नहीं है। –

उत्तर

8

आप नहीं 'अलग' एक Boost.ASIO सॉकेट कर सकते हैं। asio::socket ऑब्जेक्ट से संभालने के लिए आप native_handle() सदस्य फ़ंक्शन का उपयोग कर सकते हैं, लेकिन आपको यह सुनिश्चित करना होगा कि asio::socket ऑब्जेक्ट तब तक नष्ट नहीं हो जाता जब तक आप SOCKET के साथ नहीं कर लेते। यह देशी SOCKET के स्वामित्व को जारी रखता है और इसे नष्ट करने पर इसे बंद कर देगा।

एंड्रै की तरह सुझाव दिया गया है, तो आप सॉकेट हैंडल को डुप्लिकेट कर सकते हैं। हालांकि, मैं इस सॉकेट को डुप्लिकेट करने पर विचार नहीं करूंगा, क्योंकि बूस्ट.एएसआईओ स्वचालित रूप से मूल SOCKET को I/O पूर्णता पोर्ट के साथ संभालता है। यदि .NET सॉकेट रैपर या कोई अन्य कोड डुप्लीकेट सॉकेट को एक अलग I/O समापन पोर्ट से संबद्ध करने का प्रयास करता है, तो एक त्रुटि उत्पन्न होगी। मुझे पता है कि .NET 2.0 सॉकेट क्लास वास्तव में SOCKET एसिंक्रोनस ऑपरेशंस के लिए I/O समापन पोर्ट के साथ संभालती है। हालांकि, यह हाल के संस्करणों में बदल सकता है।

+2

या ['WSADuplicateSocket'] (http://msdn.microsoft.com/en-us/library/ms741565 (v = VS.85) .aspx का उपयोग करें), तो इससे कोई फर्क नहीं पड़ता कि बूस्ट हैंडल को बंद कर देता है, आप एक ही सॉकेट के लिए एक स्वतंत्र हैंडल है जो इसे खोलता रहता है। (माना जाता है कि बूस्ट कॉल 'क्लोजसॉकेट' और 'शटडाउन' नहीं) –

+0

भले ही आप सॉकेट को अलग नहीं कर सकते हैं, फिर भी आप [सॉकेट हैंडल डुप्लिकेट] कर सकते हैं (http://msdn.microsoft.com/en-us/library/ ms741565 (v = VS.85) .aspx) ताकि दोनों abstractions दो अलग हैंडल के माध्यम से एक ही सॉकेट साझा कर सकते हैं। –

+0

बूस्ट कार्यान्वयन सॉकेट के हैंडल को I/O पूर्णता पोर्ट के साथ जोड़ता है। मैं इस सॉकेट को डुप्लिकेट करने पर विचार नहीं करता, जब तक कि आप 100% सुनिश्चित न हों कि किसी अन्य कोड को दूसरे I/O समापन पोर्ट से संबद्ध करने का प्रयास करने का कोई मौका नहीं है; मुझे पता है कि 2.0 .NET सॉकेट क्लास आंतरिक रूप से एसिंक ऑपरेशंस के लिए आईओसीपी का उपयोग करता है, हालांकि बाद के संस्करणों में यह बदल सकता है। –

3

आप शायद, PROTOCOL_INFO संरचना WSADuplicateSocket() द्वारा लौटाए का उपयोग वह अपने SocketInformation बराबर में बदलने और फिर appropriate socket constructor का उपयोग एक अलग संभाल के साथ एक साझा सॉकेट प्राप्त करने के लिए कर सकते हैं।

WSADuplicateSocket() पर प्रलेखन में "टिप्पणियां" अनुभाग सॉकेट डुप्लिकेशन में शामिल सामान्य नियंत्रण प्रवाह दर्शाता है। मुझे लगता है कि यह प्रवाह कुछ हद तक SocketInformation Socket::DuplicateAndClose() और Socket(SocketInformation) कॉल की जोड़ी के बराबर है।

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