2012-06-04 13 views
10

वर्तमान में मैं विंडोज पर एक बहु-प्रक्रिया डेस्कटॉप एप्लिकेशन पर काम कर रहा हूं। यह एप्लिकेशन एक संकीर्ण लपेटा हुआ एप्लीकेशन होगा जो दुनिया भर में क्लाइंट मशीनों पर तैनात किया जाएगा। जबकि हम मशीनों के लिए व्यापक विनिर्देश प्राप्त कर सकते हैं - उदा। .NET 4.0 सीएफ के साथ विंडोज एक्सपी एसपी 3, हम उनके ऊपर नियंत्रण नहीं करेंगे और हम उनकी कॉन्फ़िगरेशन पर बहुत विशिष्ट नहीं हो सकते हैं - उदा। हम निर्दिष्ट नहीं कर सकते कि मशीन में एक cuda 1.4 सक्षम ग्राफिक प्रोसेसर आदि होना चाहिएसी # सॉकेट बनाम पाइप्स

इनमें से कुछ प्रक्रियाएं प्रबंधित की जाती हैं (.NET 4.0) और अन्य अप्रबंधित (सी ++ Win32) हैं। प्रक्रियाओं को डेटा साझा करने की आवश्यकता है। विकल्प की तारीख के लिए मूल्यांकन किया है

  • TCP सॉकेट
  • नाम पाइप्स

पाइप्स थोड़ा बेहतर है, लेकिन हमारी जरूरतों के लिए प्रदर्शन करने के लिए लग रहे हैं - दोनों से प्रदर्शन स्वीकार्य हैं। और सॉकेट हमें क्रॉसिंग मशीन (और ऑपरेटिंग सिस्टम - हम अंततः गैर-माइक्रोसॉफ्ट ओएस का समर्थन करना चाहते हैं) भविष्य में सीमाओं को लचीलापन देते हैं इसलिए सॉकेट के साथ जाने की हमारी प्राथमिकता।

हालांकि - मेरी प्रमुख चिंता यह है - अगर हम टीसीपी सॉकेट का उपयोग करते हैं - क्या हम फ़ायरवॉल के साथ मुद्दों में भाग लेने की संभावना रखते हैं? क्या किसी और ने डेस्कटॉप एप्लिकेशन/प्रोग्राम तैनात किए हैं जो आईपीसी और अनुभवी मुद्दों के लिए टीसीपी का उपयोग करते हैं? यदि हां - तो किस तरह का?

मुझे पता है कि यह एक काफी खुला प्रश्न है और मुझे फिर से खुशी होगी। लेकिन मैं वास्तव में जानना चाहूंगा कि हमें किस प्रकार की संभावित समस्याएं चलने की संभावना है।

संपादित करें: थोड़ा और प्रकाश डालने के लिए - हम केवल कुछ पीओडी, स्याही, फ्लोट और तारों को ले जा रहे हैं। हमने अमूर्तता की एक परत बनाई है जो 2 प्रतिमान प्रदान करता है - एक अनुरोध/प्रतिक्रिया और सदस्यता। परिवहन परत को दूर कर दिया गया है और वर्तमान में हमारे पास दो कार्यान्वयन हैं - पाइप आधारित और टीसीपी आधारित।

+0

स्पष्ट होने के लिए, यह केवल एक मशीन पर है, इसलिए आप नामित पाइप का उपयोग डेस्कटॉप के बीच संवाद करने के लिए नहीं कर रहे हैं? या नेटवर्क पर कुछ संचार भी होगा? –

+0

अभी के लिए - सभी प्रक्रियाएं एक मशीन पर चल रही हैं। आखिरकार - सड़क के नीचे रास्ता - हम विभिन्न मशीनों पर प्रक्रियाओं को चलाएंगे। – quixver

+0

आप यह सुनिश्चित करना चाहते हैं कि आप सड़क के लिए डिज़ाइन करें :) जब तक "सड़क से नीचे रास्ता" सैद्धांतिक नहीं है ... – bryanmac

उत्तर

5

तेजी से लैन पर पाइप का प्रदर्शन अक्सर बेहतर होता है लेकिन टीसीपी अक्सर धीमे नेटवर्क या डब्ल्यूएएन पर बेहतर होता है। नीचे msdn अंक देखें।

टीपीसी अधिक विन्यास योग्य है। फ़ायरवॉल के बारे में, वे आपको संचार बंदरगाहों को खोलने/बंद करने की अनुमति देते हैं। यदि यह कोई विकल्प या चिंता नहीं है, तो एक अन्य विकल्प http (REST/json, वेब सेवा, xml rpc, आदि ...) होगा, लेकिन यह सुनिश्चित नहीं है कि http ओवरहेड स्वीकार्य है या नहीं। सुनिश्चित करें कि आप इसे वास्तविक विश्व डेटासेट के साथ आज़माएं (एक परीक्षण में मामूली डेटा पास करने से ओवरहेड अनुचित लगता है - अक्सर, असली दुनिया डेटा सेट की तुलना में मामूली है)।

msdn से कुछ अन्य जानकारी:

एक तेजी से लोकल एरिया नेटवर्क में (लैन) पर्यावरण, ट्रांसमिशन कंट्रोल प्रोटोकॉल/इंटरनेट प्रोटोकॉल (टीसीपी/आईपी) सॉकेट और नामांकित पाइप्स ग्राहकों के मामले में तुलना के योग्य हैं प्रदर्शन। हालांकि, प्रदर्शन टीसीपी/आईपी सॉकेट और नामांकित पाइप्स क्लाइंट के बीच अंतर धीमे नेटवर्क के साथ स्पष्ट हो जाता है, जैसे विस्तृत क्षेत्र नेटवर्क (WANs) या डायल-अप नेटवर्क। यह इंटरप्रोसेस संचार (आईपीसी) तंत्र विभिन्न तरीकों के कारण सहकर्मियों के बीच संवाद करता है।

नामित पाइप के लिए, नेटवर्क संचार आमतौर पर अधिक इंटरैक्टिव होते हैं। एक सहकर्मी तब तक डेटा नहीं भेजता जब तक कोई अन्य सहकर्मी इसे पढ़ने के लिए मांगता है।एक नेटवर्क पढ़ने में आम तौर पर डेटा पढ़ने के लिए शुरू होने से पहले चोटी नामित पाइप संदेशों की श्रृंखला शामिल होती है। ये धीमी नेटवर्क में बहुत महंगा हो सकते हैं और अत्यधिक नेटवर्क यातायात का कारण बन सकते हैं, जो बदले में अन्य नेटवर्क क्लाइंट को प्रभावित करता है।

यह स्पष्ट करना भी महत्वपूर्ण है कि क्या आप स्थानीय पाइप या नेटवर्क पाइप के बारे में बात कर रहे हैं। यदि सर्वर एप्लिकेशन पर स्थानीय रूप से चल रहा है कंप्यूटर Microsoft® SQL Server ™ 2000 का उदाहरण चला रहा है, तो स्थानीय नामित पाइप्स प्रोटोकॉल एक विकल्प है। स्थानीय नामित पाइप कर्नेल मोड में चलता है और यह बेहद तेज़ है।

टीसीपी/आईपी सॉकेट के लिए, डेटा ट्रांसमिशन अधिक सुव्यवस्थित हैं और कम ओवरहेड हैं। डेटा ट्रांसमिशन टीसीपी/आईपी सॉकेट प्रदर्शन वृद्धि तंत्र जैसे खिड़की, देरी पावती, और इसी तरह से लाभ ले सकता है, जो धीमी नेटवर्क में बहुत फायदेमंद हो सकता है। अनुप्रयोगों के प्रकार के आधार पर, इस तरह के प्रदर्शन मतभेद महत्वपूर्ण हो सकते हैं।

टीसीपी/आईपी सॉकेट भी एक बैकलॉग कतार है, जो नामित पाइप कि पाइप व्यस्त त्रुटियों को जन्म दे सकती है जब आप SQL सर्वर से कनेक्ट करने के प्रयास कर रहे हैं की तुलना में एक सीमित चौरसाई प्रभाव प्रदान कर सकते हैं समर्थन करते हैं।

> सामान्य में, सॉकेट एक धीमी गति से लैन, वैन में पसंद किया जाता है, या डायल-अप नेटवर्क, नामित पाइप एक बेहतर विकल्प जब नेटवर्क गति मुद्दा नहीं है के रूप में इसे और अधिक कार्यक्षमता प्रदान करता है, आसानी हो सकती है, जबकि, उपयोग, और कॉन्फ़िगरेशन विकल्प।

टीसीपी/आईपी के बारे में अधिक जानकारी के लिए, माइक्रोसॉफ्ट विंडोज एनटी® दस्तावेज देखें।

+0

प्रदर्शन परिप्रेक्ष्य ब्रायन को इंगित करने के लिए धन्यवाद! हमने वास्तव में नेटवर्क की गति को नहीं माना था। आज तक हमारा प्रदर्शन परीक्षण उसी मशीन पर विभिन्न प्रक्रियाओं को चलाने पर केंद्रित है। हमने वास्तव में वितरित परिदृश्य के लिए अधिक परीक्षण प्रयास नहीं किया है। प्रतिरूपण के बारे में – quixver

2

आप impersonate the named pipe client's security credentials की जरूरत है, वहाँ वास्तव में केवल एक ही विकल्प है :) और नामित पाइप भी अच्छे नामों है (हालांकि डीएनएस SRV रिकॉर्ड TCP पोर्ट के लिए उन भी प्रदान कर सकते हैं)।

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

+0

+1 ... – bryanmac

+0

प्रतिरूपण को इंगित करने के लिए धन्यवाद! – quixver

+0

जब तक मैं गलत समझ नहीं लेता तब तक मैं बिल्कुल सही नहीं हूं। नामित पाइप बाइट या संदेश मोड में बनाया जा सकता है। संदेश मोड में, पाइप पर प्रत्येक WriteFile एक अलग संदेश बन जाता है। –

1

यदि मैं आपकी आवश्यकताओं को सही ढंग से समझता हूं तो आपको उसी कंप्यूटर पर चलने वाली प्रक्रियाओं के बीच संवाद करने की आवश्यकता है। प्रक्रियाएं संभवतः उपयोगकर्ता के समान सुरक्षा संदर्भ में चलती हैं जो इंटरैक्टिव रूप से लॉग ऑन होती है।

मामले में मुझे यह उल्लेख करना चाहिए कि समाधान के विभिन्न पहलू हैं। अनुप्रयोगों के बीच डेटा साझा करने के लिए केवल एक समस्या है। एक और समस्या प्रोटोकॉल है जो परिभाषित करता है कि आम डेटा को कैसे पहुंचाया जा सकता है और संशोधित किया जा सकता है और प्रक्रियाओं के बीच संचार कैसे होता है। उदाहरण के लिए आप एक प्रक्रिया कर सकते हैं जो डेटा प्रदान करता है डेटा और अन्य सभी डेटा सदस्यता लें। एक और मामला: आपके पास सामान्य डेटा हो सकता है जिसे सभी अनुप्रयोगों द्वारा पढ़ा या संशोधित किया जा सकता है और आपको केवल यह सुनिश्चित करने की आवश्यकता है कि कोई भी साझा डेटा को एक ही समय में संशोधित न करे या कोई भी इसे संशोधित करने के दौरान डेटा तक पहुंच न सके। कारण यह कई अन्य अलग-अलग संचार परिदृश्य हो सकता है।

पहलू के तहत मैं तुम्हें दो अन्य विकल्प जो आप अपने प्रश्न में शामिल नहीं करना सुझाव है:

  • उपयोग स्मृति मैप की गई फ़ाइलों (here और here देखें) COM इंटरफेस का
  • उपयोग

दोनों तरीकों को .NET और अप्रबंधित सी ++ दोनों में लागू किया जा सकता है। मेमोरी मैप की गई फ़ाइलों का उपयोग प्रदर्शन बिंदु से सबसे अच्छा तरीका है। यदि आप व्यू बनाते हैं जो कुछ भौतिक फ़ाइल से संबद्ध नहीं होगा, तो आपके पास सामान्य स्मृति होगी जो प्रक्रियाओं के बीच उपयोग की जा सकती है। आप अतिरिक्त रूप से एक म्यूटेक्स या इवेंट का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि स्मृति को एक ही समय में एकाधिक अनुप्रयोगों द्वारा उपयोग नहीं किया जाएगा।

सबसे सरल परिदृश्य में आप भी C++ #pragma data_seg उपयोग कर सकते हैं DLL के नाम पर रखा गया अनुभाग में कुछ डेटा जगह है और /SECTION विकल्प का उपयोग करने के लिए (जैसे /SECTION:.MYSEC,RWS) डेटा साझा बनाने के लिए। आप सामान्य डेटा तक पहुंचने के लिए अपने सभी .NET अनुप्रयोगों में और सभी अप्रबंधित C++ एप्लिकेशन में DLL का उपयोग कर सकते हैं। जिस तरह से आपके पास सामान्य डेटा तक पहुंचने का आसान तरीका होगा।

यदि आपको कुछ और जटिल संचार परिदृश्य सी ++/COM में COM इंटरफ़ेस के साथ दृष्टिकोण की आवश्यकता है तो नेट सबसे अच्छा विकल्प हो सकता है। यदि मैं आपको the article की अनुशंसा करता हूं, तो डायरेक्ट इंटरऑप असेंबली को केवल .NET में COM इंटरफ़ेस के साथ कार्यान्वित करने के चरण-दर-चरण का वर्णन करता है और संचार के लिए .NET और C++ COM दोनों में इसका उपयोग करता है।

+0

हाय ओलेग, स्मृति मैप की गई फ़ाइलों को लाने के लिए धन्यवाद।हालांकि मुझे नहीं लगता कि हम उस मार्ग से नीचे जायेंगे क्योंकि दोनों पाइप और सॉकेट (उसी मशीन पर) आंतरिक रूप से मेमोरी मैप की गई फाइलों का उपयोग करते हैं - और हम ओवरहेड के साथ ठीक हैं। हम लचीलापन पाइप और सॉकेट हमें पसंद करेंगे - क्योंकि हम भविष्य में विभिन्न प्रक्रियाओं को विभिन्न मशीनों में ले जा सकते हैं। COM के रूप में - दुर्भाग्य से मैं इसके खिलाफ पूर्वाग्रह कर रहा हूं ... DCOM का उपयोग कर अनुप्रयोगों का समर्थन करने में बहुत सालों;) – quixver

+0

ओह - और हम कुछ अनुप्रयोगों (अंततः) को गैर माइक्रोसॉफ्ट प्लेटफॉर्म पर ले जाने का विकल्प भी लेना चाहते हैं। – quixver

+0

@quixver: यह कहना सही नहीं है कि "दोनों पाइप और सॉकेट (उसी मशीन पर) आंतरिक रूप से स्मृति मैप की गई फ़ाइलों का उपयोग करते हैं"। सॉकेट मेमोरी मैप की गई फ़ाइलों का बिल्कुल उपयोग नहीं करते हैं और नामित पाइप अधिक जटिल होते हैं जैसा कि पहली बार दिख सकता है। यदि आप केवल 'CreateNamedPipe' के पैरामीटर की जांच करते हैं तो आप इसे देखेंगे। मैं सिर्फ आपके प्रश्न में लिखी गई जानकारी का उपयोग करता हूं। आपने "नेट 4.0 सीएफ के साथ विंडोज एक्सपी एसपी 3" और "गैर माइक्रोसॉफ्ट प्लेटफ़ॉर्म" और "विंडोज़ पर बहु-प्रक्रिया डेस्कटॉप एप्लिकेशन" के बारे में कुछ भी नहीं लिखा है। यदि आपको विभिन्न कंप्यूटरों के बीच संचार की आवश्यकता है * आपको इसे – Oleg