2010-12-31 2 views
5

मैंने इस पोस्ट को रीमेड किया क्योंकि मेरा शीर्षक विकल्प भयानक था, इसके बारे में खेद है। मेरे नए पोस्ट यहां पाया जा सकता: After sending a lot, my send() call causes my program to stall completely. How is this possible?मैं बहुत छोटे भेजने के लिए टीसीपी का उपयोग कर रहा हूं, क्या मुझे नागल्स एल्गोरिदम बंद करना चाहिए? (लोग इसे TCP_NODELAY के रूप में भी जानते हैं)

आपका बहुत-बहुत हर किसी को धन्यवाद। समस्या यह थी कि ग्राहक वास्तव में बॉट हैं और वे कनेक्शन से कभी नहीं पढ़ते हैं। (मूर्ख Feels)

+0

आप बस अपना शीर्षक संपादित कर सकते हैं, आपको पता है। – caf

+0

हाहा मैंने कोशिश की लेकिन मैं इसे समझ नहीं पाया .. मुझे बहुत पसंद आया होगा: /। – returneax

उत्तर

4

TCP_NODELAY रिसीवर के लिए प्रेषक से छोटे पैकेट की विलंबता मदद कर सकता है, लेकिन विवरण आप अलग दिशा में अंक दे दी है। मैं निम्नलिखित कल्पना कर सकते हैं:

  • अधिक डेटा रिसीवर से वास्तव में उपभोग भेजा जा रहा है - यह अंत में प्रेषक के बफर (SO_SNDBUF) overflows और send(2) सिस्टम कॉल में "अटक जाने" प्रकट करने के लिए सर्वर प्रक्रिया का कारण बनता है। इस बिंदु पर कर्नेल कुछ उत्कृष्ट डेटा को स्वीकार करने के लिए दूसरे छोर के लिए इंतजार कर रहा है, लेकिन रिसीवर इसकी अपेक्षा नहीं करता है, इसलिए यह recv(2) नहीं है।

शायद अन्य स्पष्टीकरण हैं, लेकिन कोड को देखे बिना बताना मुश्किल है।

+0

हाय निकोलाई, मुझे इस तथ्य के बारे में पता है कि ग्राहक कभी भी डेटा नहीं पढ़ रहे हैं। ग्राहकों को एक और कार्यक्रम द्वारा अनुकरण किया जा रहा है। अगर वे कभी डेटा प्राप्त नहीं करेंगे तो क्या मेरा खुद का बफर बह जाएगा? – returneax

+0

हां, इस तरह टीसीपी काम करता है। –

+0

दूसरे विचार पर, ऐसा लगता है कि यूडीपी आपकी आवश्यकताओं को बेहतर तरीके से फिट कर सकता है। –

2

Nagle के नहीं होगा का कारण है, जिसके कारण उसे अक्षम आप मदद नहीं करता है "कर्नेल में गायब"। नागले की इच्छा थोड़ी देर के लिए डेटा बफर करेगा, लेकिन आखिर में उपयोगकर्ता से किसी भी संकेत के बिना इसे भेज देगा।

कुछ अन्य अपराधी नहीं है।


अद्यतन प्रश्न के लिए संपादित करें।

आपको यह सुनिश्चित करना होगा कि क्लाइंट सभी भेजे गए डेटा प्राप्त कर रहा है, और यह जल्दी प्राप्त कर रहा है। प्रत्येक क्लाइंट को लॉग या कुछ सत्यापित करने के लिए लिखें।

उदाहरण के लिए, यदि एक ग्राहक सर्वर अपने 23-बाइट अपडेट स्वीकार करने के लिए इंतज़ार कर रहा है, तो यह डेटा प्राप्त नहीं हो सकता है। इससे सर्वर के बफर को भरने का कारण बन सकता है, जिससे गिरावट और अंततः डेडलॉक हो सकता है।

अगर यह वास्तव में दोषी है, समाधान कुछ अतुल्यकालिक संचार, बूस्ट के एसियो पुस्तकालय जैसा होगा।

+0

हाँ, मैंने यही सोचा था। मैं वास्तव में हालांकि कम सुराग हूँ। मैं जो कुछ देख रहा हूं वह टीसीपी बफर आकार हो सकता है ... मैं वास्तव में नहीं जानता -_- – returneax

+0

@returneax क्या आप अपने प्रश्न को उस कोड को शामिल करने के लिए संशोधित कर सकते हैं जिसका उपयोग आप दोनों क्लाइंट पर भेजने/आरईवी डेटा भेजने के लिए कर रहे हैं और सर्वर? मुझे आश्चर्य है कि क्या आप डेडलॉक का कारण बनने के लिए कुछ कर रहे हैं, आदि – chrisaycock

+0

निश्चित रूप से, ग्राहक सी # में लिखा गया है और मेरा मित्र इसे लिख रहा है लेकिन अभी के लिए मैं आपको सर्वर कोड दे सकता हूं। इसके अलावा सर्वर बहुप्रचारित है ... – returneax

4

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

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

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