2010-02-07 6 views
18

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

+5

मैं इस प्रश्न के बारे में कुछ अनिश्चित हूं ... क्या आप एक ही मेजबान पर दो प्रक्रियाओं के बीच डेटा स्थानांतरित करने के बारे में पूछ रहे हैं, या दो प्रक्रियाओं (या हो सकता है) विभिन्न मेजबानों पर चल रहे हैं? –

+0

यदि आप एक बेहतर समाधान की तलाश में हैं, तो अब आप क्या कर रहे हैं? – ergosys

+0

@ जेरेमी: क्षमा करें, मैं पर्याप्त स्पष्ट नहीं था। दो प्रक्रियाएं एक ही मशीन पर हैं। –

उत्तर

15

boost::asio एक क्रॉस प्लेटफार्म लाइब्रेरी है जो सॉकेट पर एसिंक्रोनस आईओ को संभालने वाला है। आप अपने वास्तविक संदेशों के लिए उदाहरण Google Protocol Buffers के उपयोग के साथ इसे जोड़ सकते हैं।

बूस्ट आपको उसी मशीन पर इंटरप्रोसेस संचार के लिए boost::interprocess प्रदान करता है, लेकिन एएसआई आपको अपने संचार को असीमित रूप से करने देता है और आप स्थानीय और दूरस्थ कनेक्शन दोनों के लिए आसानी से एक ही हैंडलर रख सकते हैं।

+1

हां, विजेता कॉम्बो –

+0

ठीक है, ऐसा लगता है कि बूस्ट इस तरह से जाने का तरीका है ... मैं इसे पहले से ही बढ़ावा देने के लिए उपयोग कर रहा हूं :: सिग्नल और मैं शायद इसे बढ़ावा देने के लिए उपयोग कर रहा हूं :: asio –

+0

Google प्रोटोकॉल बफर के साथ , आप [कई उपलब्ध आरपीसी कार्यान्वयन] (http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns) से चुन सकते हैं। –

2

यह एक कठिन समस्या है।

बाधा इंटरनेट है, और यह कि आपके ग्राहक एनएटी पर हो सकते हैं।

यदि आप इंटरनेट से बात नहीं कर रहे हैं, या यदि आपके पास स्पष्ट रूप से वाहक ग्रेड बुराई एनएटी के पीछे ग्राहक नहीं हैं, तो आपको कहना होगा।

क्योंकि यह नीचे उबलता है: टीसीपी का उपयोग करें। इसे चूसो

+0

दो प्रक्रियाएं एक ही मशीन पर हैं, लेकिन उनमें से एक इंटरनेट से संचार कर रही है। अन्य प्रक्रिया को पी 2 पी नेटवर्क पर डेटा भेजने के लिए उस के साथ संवाद करना चाहिए। –

+0

आह, और मैं सोच रहा था कि सवाल पी 2 पी नेटवर्क बनाने के बारे में था। मैंने छेद-पंचिंग और रिले सर्वरों और इस तरह से भी शुरू नहीं किया था। – Will

1

मैं दृढ़ता से टीसीपी या यूडीपी सॉकेट के शीर्ष पर Protocol Buffers का सुझाव दूंगा।

+2

जबकि कुछ परिस्थितियों में यूडीपी अच्छा हो सकता है, टीसीपी एक तरीका है यदि आप एक टुकड़े में डेटा चाहते हैं और विलंबता सबसे महत्वपूर्ण घटक नहीं है। – Xorlev

6

मैं ज़ीरो (www.zeroc.com) द्वारा आईसीई का उपयोग कर रहा हूं, और यह शानदार रहा है। सुपर उपयोग करने में आसान है, और यह न केवल क्रॉस प्लेटफ़ॉर्म है, बल्कि कई भाषाओं के लिए भी समर्थन करता है (पायथन, जावा, आदि) और यहां तक ​​कि लाइब्रेरी का एक एम्बेडेड संस्करण भी है।

+1

आईसीई या तो आवश्यक है कि आप अपने कार्यक्रम को जीपीएल के तहत प्रकाशित करें या एक वाणिज्यिक लाइसेंस खरीदें, जो ओपी के लिए कोई समस्या उत्पन्न नहीं कर सकता है या नहीं। – villintehaspam

+1

प्रोग्राम स्वयं जीपीएल के तहत लाइसेंस प्राप्त होगा, इसलिए यह कोई समस्या नहीं है –

+0

ज़ीरोसी Google प्रोटोकॉल बफर का उपयोग करता है। –

1

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

पहला, आईसीई library here एक एनएटी ट्रैवर्सल तकनीक है जो नेटवर्क में STUN और/या टर्न सर्वर के साथ काम करती है। आपको काम करने के लिए कुछ बुनियादी ढांचा प्रदान करना पड़ सकता है, हालांकि कुछ सार्वजनिक स्टन सर्वर हैं।

दूसरा, यूपीएनपी और एनएटी-पीएमपी दोनों का उपयोग करें। उदाहरण के लिए, एक पुस्तकालय here

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

3

अच्छा, अगर हम मान सकते हैं कि एक ही मशीन पर दो प्रक्रियाएं चल रही हैं, तो डेटा को साझा मात्रा क्षेत्र के अंदर डेटा को रखकर बड़ी मात्रा में डेटा स्थानांतरित करने का सबसे तेज़ तरीका है; उस सेटअप के साथ, डेटा को कभी भी कॉपी नहीं किया जाता है, क्योंकि दोनों प्रक्रियाएं सीधे इसका उपयोग कर सकती हैं। (यदि आप आगे भी जाना चाहते थे, तो आप दो कार्यक्रमों को एक कार्यक्रम में जोड़ सकते हैं, प्रत्येक पूर्व 'प्रक्रिया' के बजाय अब उसी प्रक्रिया स्थान के अंदर धागे के रूप में चल रहा है।उस स्थिति में वे स्वचालित रूप से एक दूसरे के साथ अपनी स्मृति का 100% साझा करेंगे)

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