2013-07-11 12 views
6

के बीच कर्नेल-आधारित (लिनक्स) डेटा रिले मैंने टीसीपी रिले सर्वर लिखा जो पीयर-टू-पीयर राउटर (सुपरर्नोड) की तरह काम करता है।दो टीसीपी सॉकेट

सरलतम मामले रहे हैं दो खोला सॉकेट और उन दोनों के बीच डेटा रिले:

clientâ < ---> सर्वर < ---> clientB

हालांकि सर्वर लगभग 2000 ऐसी अटल बिहारी सेवा करने के लिए है जोड़े, यानी। 4000 सॉकेट ...

दो अच्छी तरह से ज्ञात userland में डेटा स्ट्रीम रिले कार्यान्वयन कर रहे हैं (socketA.recv() के आधार पर -> socketB.send() और socketB.recv() -> socketA.send()):

  • का उपयोग करते हुए/चुनाव कार्यों (गैर अवरुद्ध विधि)
  • धागे की का उपयोग कर चयन/कांटे (अवरुद्ध विधि)

मैंने थ्रेड का उपयोग किया ताकि सबसे खराब मामले में सर्वर 2 * 2000 धागे बनाता है! मुझे ढेर के आकार को सीमित करना था और यह काम करता है लेकिन क्या यह सही समाधान है? मेरे सवाल का

कोर:

वहाँ एक रास्ता userland में दो सॉकेट के बीच प्रसारण सक्रिय डेटा से बचने के लिए है?

ऐसा लगता है कि एक निष्क्रिय तरीका है। उदाहरण के लिए, मैं प्रत्येक सॉकेट से फ़ाइल डिस्क्रिप्टर बना सकता हूं, दो पाइप बना सकता हूं और dup2() का उपयोग कर सकता हूं - stdin/out रीडायरेक्टिंग जैसी ही विधि। फिर दो धागे डेटा रिले के लिए बेकार हैं और इसे समाप्त/बंद किया जा सकता है। सवाल यह है कि अगर सर्वर को सॉकेट और पाइप बंद करना चाहिए और तथ्य कैसे लॉग इन करने के लिए पाइप टूटा हुआ है तो कैसे पता होना चाहिए?

मुझे "सॉकेट जोड़े" भी मिला है लेकिन मुझे इसके उद्देश्य के बारे में निश्चित नहीं है।

उपयोगकर्तालैंड को ऑफ-लोड करने और थ्रेड के लिए राशि सीमित करने के लिए आप किस समाधान का सुझाव देंगे?

कुछ अतिरिक्त स्पष्टीकरण:

  • सर्वर (ID_B साथ जैसे ID_A - बनती पहचानकर्ता।) स्थिर अनुमार्गण तालिका में परिभाषित किया गया है। क्लाइंट ए सर्वर से कनेक्ट होता है और आईडी_ए भेजता है। फिर सर्वर क्लाइंट बी के लिए इंतजार कर रहा है जब ए और बी जोड़े जाते हैं (दोनों सॉकेट खोले जाते हैं) सर्वर डेटा रिले शुरू करता है।
  • ग्राहक सममित एनएटी के पीछे सरल उपकरण हैं इसलिए एन 2 एन प्रोटोकॉल या एनएटी ट्रैवर्सल तकनीक उनके लिए बहुत जटिल हैं।

गेरहार्ड Rieger के लिए धन्यवाद मैं संकेत है:

मैं दो गिरी अंतरिक्ष तरीके के बारे में पता से बचने के लिए कर रहा हूँ पढ़ने/लिखने, recv/उपयोगकर्ता अंतरिक्ष में भेज:

  • sendfile
  • splice

दोनों में फ़ाइल डिस्क्रिप्टर के प्रकार के संबंध में प्रतिबंध हैं।

dup2 कर्नेल, AFAIK में कुछ करने में मदद नहीं करेगा।

मैन पेज: splice(2)splice(2)vmsplice(2)sendfile(2)tee(2)

संबंधित लिंक:

+1

उन कई कनेक्शनों के लिए, कुछ धागे और ['एपोल (4)'] (http://linux.die.net/man/4/epoll) का संयोजन शायद कुछ ऐसा है जो आपको देखना चाहिए। –

+1

वह, और आप कुछ [libev] (http://software.schmorp.de/pkg/libev.html) – Hasturkun

+0

धन्यवाद का उपयोग कर सकते हैं। हालांकि यह अभी भी उपयोगकर्तालैंड में सक्रिय रिले है। मेरा मानना ​​है कि एक निष्क्रिय विधि मौजूद है। सर्वर 5 एस टाइमआउट के साथ क्लाइंट की आईडी के लिए इंतजार कर रहा है, इसलिए थ्रेड को युग्मन चरण के लिए प्राकृतिक पसंद लग रहा था। – nopsoft

उत्तर

5

बीएसडी लागू करता SO_SPLICE:

क्या लिनक्स कुछ समान समर्थन करता है या केवल अपना कर्नेल-मॉड्यूल समाधान है?

3

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

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

+0

धन्यवाद। EPOLLONESHOT या ADD/DEL का उपयोग करने के लिए बेहतर है? यहां http://stackoverflow.com/questions/4173024/question-about-epoll-and-splice या http://rg4.net/archives/375.html की तरह? – nopsoft

+0

कभी भी EPOLLONESHOT की कोशिश नहीं की, हालांकि यह उपयोगी हो सकता है और शायद EPOLLET के लिए एक सुरुचिपूर्ण विकल्प हो सकता है। जटिलता को सीमित करने के लिए मानक एडीडी/डीएल से शुरू करें और आवश्यकता होने पर बाद में अनुकूलित करने का प्रयास करें। –

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