एक ही खुली सॉकेट पर असीमित बहु-दिशा सर्वर-क्लाइंट संचार?

मेरे पास क्लाइंट-सर्वर ऐप है जहां क्लाइंट विंडोज मोबाइल 6 डिवाइस पर है, जो सी ++ में लिखा गया है और सर्वर पूर्ण विंडोज़ पर है और सी # में लिखा गया है।

मूल रूप से, मुझे केवल क्लाइंट से सर्वर पर संदेश भेजने की आवश्यकता थी, सर्वर ने कभी भी एक पावती वापस भेज दी कि उसे संदेश प्राप्त हुआ। अब, मैं इसे अपडेट करना चाहता हूं ताकि सर्वर वास्तव में डेटा का अनुरोध करने के लिए क्लाइंट को एक संदेश भेज सके। जैसा कि मैंने वर्तमान में इसे स्थापित किया है, इसलिए ग्राहक सर्वर पर डेटा भेजने के बाद ही प्राप्त मोड में है, यह सर्वर को किसी भी समय अनुरोध भेजने की अनुमति नहीं देता है। मुझे ग्राहक डेटा की प्रतीक्षा करनी होगी। मेरा पहला विचार क्लाइंट पर एक अलग थ्रेड सॉकेट के साथ एक और धागा बनाना होगा, सर्वर अनुरोधों को सुनना ... जैसा सर्वर पहले से ही ग्राहक के संबंध में है। क्या किसी भी समय अनुरोध करने के लिए सभी सर्वर पर एक ही थ्रेड के भीतर और एक ही सॉकेट का उपयोग करने का कोई तरीका है?

क्या आप WaitForMultipleObjects() के प्रभाव के लिए कुछ उपयोग कर सकते हैं और इसे एक प्राप्त बफर पास कर सकते हैं और एक ऐसा ईवेंट जो बताता है कि डेटा भेजा जाना है?

0
जोड़ा संपादित
विचारों: 1

4 उत्तर

मैं इस बात पर स्पष्ट नहीं हूं कि आप सी # या सर्वर में सी ++ में सर्वर में एसिंक्रोनस बिट्स जोड़ना चाहते हैं या नहीं।

यदि आप सी ++ में ऐसा करने के बारे में बात कर रहे हैं, तो डेस्कटॉप विंडोज प्लेटफॉर्म एपीआई के माध्यम से सॉकेट I / O को असीमित रूप से कर सकता है जो ओवरलैप्ड I / O का उपयोग करता है। सॉकेट्स के लिए, WSASend, WSARecv दोनों async I / O को अनुमति देते हैं (उनके LPOVERLAPPED पैरामीटर पर दस्तावेज़ पढ़ें, जिसे आप I / O पूर्ण होने पर सेट होने वाली घटनाओं के साथ पॉप्युलेट कर सकते हैं)।

मुझे नहीं पता कि विंडोज मोबाइल प्लेटफार्म इन कार्यों का समर्थन करते हैं, इसलिए आपको कुछ अतिरिक्त खुदाई करना पड़ सकता है।

0
जोड़ा

asio देखें। यह एसिंक्रोनस आईओ के लिए एक क्रॉस कंपटेबल सी ++ लाइब्रेरी है। मुझे यकीन नहीं है कि यह सर्वर के लिए उपयोगी होगा (मैंने मानक सी ++ डीएलएल को सी # प्रोजेक्ट से जोड़ने की कोशिश नहीं की है) लेकिन क्लाइंट के लिए यह उपयोगी होगा।

हम इसे अपने आवेदन के साथ उपयोग करते हैं, और यह हमारी अधिकांश आईओ समवर्ती समस्याओं का समाधान करता है।

0
जोड़ा

जब मुझे क्लाइंट-सर्वर मॉडल के साथ एक एप्लीकेशन लिखने की आवश्यकता होती है जहां ग्राहक छोड़ सकते हैं और जब भी चाहें दर्ज कर सकते हैं, (मुझे लगता है कि मोबाइल एप्लिकेशन का उपयोग करते समय भी आपके आवेदन के मामले में यह मामला है) मैंने यह सुनिश्चित किया है कि ग्राहक एक ऑनलाइन सर्वर को संदेश, यह इंगित करता है कि वे जुड़े हुए थे और जो कुछ भी करने की ज़रूरत थी, करने के लिए तैयार थे।

उस समय सर्वर क्लाइंट को वापस खुले कनेक्शन के संदेश भेज सकता था।

साथ ही, लेकिन मुझे नहीं पता कि यह आपके लिए लागू है या नहीं, मेरे पास सर्वर पर भेजे गए क्लाइंट दिल की धड़कन कुछ प्रकार का था, यह बताते हुए कि यह अभी भी ऑनलाइन था। इस तरह सर्वर जानता है कि जब ग्राहक को नेटवर्क से जबरन डिस्कनेक्ट किया गया था और यह उस क्लाइंट को ऑफ़लाइन के रूप में चिह्नित कर सकता था।

0
जोड़ा

एकल धागे में एसिंक्रोनस संचार का उपयोग करना पूरी तरह से संभव है!

There is a common design pattern in network software development called the reactor pattern (look at this book). Some well known network library provides an implementation of this pattern (look at ACE).

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

0
जोड़ा