2011-06-02 14 views
14

मैं सॉकेट प्रोग्रामिंग के लिए नया हूं (जैसा कि आप पहले से ही मेरे मूर्ख सवाल से पता लगाते हैं), लेकिन रखते हुए मेरी शर्मिंदगी अलग है, मैं टीसीपी पॉज़िक्स का उपयोग कर एक प्रोग्राम लिख रहा हूं। मेरी बाधा निम्नलिखित है: क्लाइंट से सर्वर पर भेजा जाने वाला संदेश, बाइट स्ट्रीम के रूप में पढ़ा जाना चाहिए और जब मेरा एप्लिकेशन उच्च प्रदर्शन नहीं होता है, तो संदेश जितनी जल्दी हो सके वितरित किया जाना चाहिए। मैंने निम्नलिखित करने के इरादे से एक टीसीपी क्लाइंट क्लास लिखा: 1 कनेक्ट - कई भेजते हैं - और स्ट्रीमिंग के अंत में 1 बंद। समस्या यह है कि संदेश निकट-वास्तविक समय में वितरित नहीं होते हैं (मुझे लगता है कि बेहतर थ्रूपुट के लिए एक बड़ा पैकेज रखने का इंतजार है) कुछ शोध करने के बाद, मैंने पाया कि जब आप नागल एल्गोरिदम को अक्षम कर सकते हैं (एनए), ऐसा करने के लिए यह बहुत बुरा विचार है। चूंकि मैं सॉकेट प्रोग्रामिंग पर नया हूं, इसलिए मैं उन सुविधाओं को अक्षम नहीं करना चाहता हूं जिन्हें मैं पूरी तरह समझ नहीं पा रहा हूं। इसलिए मैं दो (? बुरा) विकल्प के साथ छोड़ दिया है:एन * (कनेक्ट + भेजें + बंद करें) बनाम (नागल अक्षम + कनेक्ट + एन * भेजें + बंद करें), एन> 1

  1. कनेक्ट - संदेश
  2. 1 प्रति send- पास कनेक्ट - कई बार भेजने के लिए और एनए विकलांग के साथ अंत में 1 पास है। जबकि मैं एनए को अक्षम करने के परिणामों को पढ़ता हूं, ऐसा लगता है कि हर बार एक संदेश भेजने के लिए सॉकेट खोलना और बंद करना एक महंगी कीमत भी है।

सॉकेट छोड़ने के बिना अन्य समाधान हैं?

धन्यवाद।

+7

+1। – Nemo

उत्तर

12

आपके मामले में, नागल को अक्षम करना ठीक वही है जो आप करना चाहते हैं।

बस याद रखें कि लिखने के लिए हर कॉल() तुरंत आपके डेटा को प्रेषित करने जा रहा है। तो सुनिश्चित करें कि आप अपने पूरे संदेश को एक साथ पैक कर रहे हैं और फिर लिखने के लिए तैयार होने पर एक बार लिखना() (या writev()) को कॉल कर रहे हैं; छोटे पेलोड के साथ बार-बार लिखना (क्योंकि) धीमा हो जाएगा।

आपकी तरह की स्थितियां ठीक हैं कि वे आपको नाग को अक्षम क्यों करते हैं।

+0

मैं सहमत हूं। नागल को अक्षम करना अतिरिक्त तीन-तरफा हैंडशेक, साथ ही अतिरिक्त फिन पैकेट के गुच्छा करने से बेहतर है। –

2

@ नीमो ने टीसीपी के लिए बहुत अच्छी सलाह दी है।

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

+0

यह मेरी प्रारंभिक प्रतिक्रिया क्या थी, लेकिन जिस बाधा ने मुझे यूडीपी से दूर धकेल दिया वह डेटा अभिन्न है। डेटम को क्रम में और सही तरीके से पहुंचना है ... अन्यथा, ऐप समझ में नहीं आता है। – Armando

+1

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

+1

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

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