2008-08-04 15 views
20

मेरे पास क्लाइंट-सर्वर ऐप है जहां क्लाइंट विंडोज मोबाइल 6 डिवाइस पर है, सी ++ में लिखा गया है और सर्वर पूर्ण विंडोज़ पर है और सी # में लिखा गया है।एक ही खुली सॉकेट पर असीमित बहु-दिशा सर्वर-क्लाइंट संचार?

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

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

उत्तर

7

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

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

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

3

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

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

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

3

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

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

7

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

नेटवर्क सॉफ्टवेयर विकास में एक सामान्य डिजाइन पैटर्न है जिसे रिएक्टर पैटर्न (look at this book) कहा जाता है। कुछ प्रसिद्ध नेटवर्क लाइब्रेरी इस पैटर्न (look at ACE) का कार्यान्वयन प्रदान करती है।

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