2009-12-16 9 views
9

क्लाइंट सॉकेट बंद पहले, जब वहाँ सर्वर से ज्यादा डेटा नहीं है, TCP कनेक्शन बंद ठीक है की तरह:TCP कनेक्शन CLOSE_WAIT स्थिति पर लटका

FIN --> 
    <-- ACK,PSH 
RST --> 
:

FIN --> 
    <-- ACK 
    <-- FIN, ACK 
ACK --> 

जब सर्वर भेजने डेटा busying है

और सर्वर कनेक्शन CLOSE_WAIT स्थिति में आता है और लंबे समय तक वहां लटकता है।

यहां समस्या क्या है? ग्राहक संबंधित या सर्वर से संबंधित? यह स्थानीय सॉकेट के लिए Redhat5 पर होता है।

यह article "आरएसटी" क्यों भेजा जाता है, इस बारे में बात करते हैं, लेकिन मुझे नहीं पता कि सर्वर कनेक्शन CLOSE_WAIT पर क्यों फंस गया है, और एक एफआईएन बाहर नहीं भेजता है।

[संपादित करें] मैंने सबसे महत्वपूर्ण जानकारी को अनदेखा किया, यह क्यूमु के स्लिप नेटवर्क इम्यूलेशन पर होता है। यह निकट कनेक्शन से निपटने के लिए स्लिप बग की समस्या प्रतीत होता है।

उत्तर

0

यह क्यूमु के लिए defect ज्ञात है।

+0

बेहतर यूआरएल: http://lists.gnu.org/archive/html/qemu-devel/2008-06/msg00372.html – qerub

2

इसका मतलब है कि स्ट्रीम में अपठित डेटा शेष है, कि क्लाइंट ने पढ़ना समाप्त नहीं किया है।

आप SO_LINGER विकल्प का उपयोग कर इसे मजबूर कर सकते हैं। लिनक्स के लिए Here's relevant documentation (विकल्प को स्वयं भी देखें, here), और [Win32 के लिए [यहां मिलान करने वाला फ़ंक्शन 2] है।

यह सर्वर पक्ष है जो खुला रहता है, इसलिए यह सर्वर पक्ष पर है, आप SO_LINGER को अक्षम करने का प्रयास कर सकते हैं।

+0

ऐसा लगता है कि SO_LINGER केवल नज़दीकी() कॉल को प्रभावित करता है, लेकिन सर्वर इसके बजाय लिखने() कॉल पर लटका है? –

+1

यदि सर्वर एक लिखित कॉल पर लटक रहा है तो आपने शायद टीसीपी विंडो भर दी है और स्टैक क्लाइंट से एसीके की प्रतीक्षा कर रहा है इससे पहले कि वह अधिक डेटा स्वीकार कर सके ... –

0

इसका मतलब यह हो सकता है कि सर्वर ने सॉकेट बंद नहीं किया है। आप उस प्रक्रिया द्वारा खुले फ़ाइल डिस्क्रिप्टरों को सूचीबद्ध करने के लिए "lsof" का उपयोग कर आसानी से यह बता सकते हैं जिसमें टीसीपी सॉकेट शामिल होंगे। फिक्स यह है कि प्रक्रिया समाप्त होने पर सॉकेट को हमेशा बंद करें (यहां तक ​​कि त्रुटि मामलों आदि में)

+0

समस्या यह है कि सर्वर लिखने पर लटका हुआ है कॉल करें, और मैं त्रुटि का पता नहीं लगा सकता। –

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