2010-03-29 14 views
5

मैं एक कस्टम टीसीपी सर्वर और क्लाइंट लिख रहा हूं और अनुरोधों का एक टन (60,000 सटीक होना) पर मुझे 10048 की सॉकेट त्रुटि प्राप्त करना शुरू होता है, जो should mean "पता पहले से उपयोग में है।"ग्राहक पर 10048 की सॉकेट त्रुटियां? संभावित कारण?

त्रुटि तब तक होती रहती है जब तक कि मैं 2 या 3 मिनट की प्रक्रिया को रोक नहीं पाता और फिर इसे फिर से शुरू करता हूं, और फिर यह पुनरारंभ करने के बाद थोड़ी सी त्रुटि को शुरू करने लगता है। अगर मैं क्लाइंट प्रक्रिया को रोकता हूं और सर्वर प्रक्रिया को पुनरारंभ करता हूं, तो मुझे अभी भी क्लाइंट पर एक ही त्रुटि मिलती है। तो यह एक पूर्ण ग्राहक पक्ष की समस्या है।

यह समझ में नहीं आता है, हालांकि यह त्रुटि केवल तभी होती है जब बाध्यकारी हो और यह त्रुटि क्लाइंट पर होती है न कि सर्वर पर। इसके लिए संभावित कारण क्या हो सकते हैं?

मेरी आरंभीकरण का एक छोटा सा अंश:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

इसके अलावा, सब कुछ किसी और (समय इसे आगे और पीछे भेजने के लिए ले जाता है की राशि सहित) काम कर ठीक लग रहा है और इस पूरी तरह से काम करता है जब 127.0.0.1 का उपयोग कर, लेकिन जब इसे एक और लैन कंप्यूटर पर डालने पर मुझे 10048 त्रुटि मिलनी शुरू हो गई।

क्या मैं इसे प्रारंभ करने में कुछ गड़बड़ कर रहा हूं? क्लाइंट पक्ष पर यह त्रुटि और क्या कारण हो सकती है?

उत्तर

9

http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption देखें। आपको डोंटलिंजर या रीयूज एडर की आवश्यकता है, या दोनों, मुझे यकीन नहीं है। मूल रूप से आपके सॉकेट टीसीपी कनेक्शन को फाड़ने के बाद TIME_WAIT स्थिति में फंस जाते हैं, एक बार जब आप उनमें से पर्याप्त हो जाते हैं, तो आप कोई भी नया क्लाइंट कनेक्शन नहीं बना पाएंगे। Netstat -na प्रोग्राम आउटपुट के साथ इसे सत्यापित करें।

तुम भी रजिस्ट्री में उसे बदल कर समय है कि सॉकेट TIME_WAIT राज्य में रहता है कम कर सकते हैं: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx डिफ़ॉल्ट 4 मिनट जो शायद विशेष रूप से परीक्षण के लिए 1 या 2 मिनट सुरक्षित रूप से कम किया जा सकता है।

अस्वीकरण: मैं किसी भी माध्यम से एक टीसीपी गुरु नहीं हूं।

+0

मैं 'जोड़ा client.LingerState = नए LingerOption (गलत, 0);' और का उपयोग कर netstat, अपने अधिकार, मैं TIME_WAIT में कनेक्शन की एक बकवास लोड – Earlz

+0

मेरा मतलब है, मेरे पास अभी भी 'LingerState' बिट – Earlz

+0

जोड़ने के बाद बहुत समय TIME_WAIT है ReuseAddr भी मदद नहीं करता है। – Earlz

0

क्या आप क्लाइंट पोर्ट से बाहर हैं?

http://www.gavaghan.org/blog/2010/02/17/tcpip-parameter-tuning-for-rapid-client-connections/

एक संभावित संबंधित सवाल: Maximum number of concurrent connections on a single port (socket) of Server

+0

यदि यह कारण है, तो जब भी मैं स्थानीयहोस्ट का उपयोग करता हूं तो यह ठीक काम कैसे करता है? – Earlz

+1

@Earlz: ऐसा इसलिए हो सकता है क्योंकि 127.0.0.1 पर कनेक्शन बहुत कम (0?) अधिकतम सेगमेंट जीवनकाल का उपयोग करते हैं, क्योंकि हम वास्तव में घूमने वाले पैकेट नहीं प्राप्त कर सकते हैं। मैं इस पर कुछ भी नहीं ढूंढ पाया, लेकिन यह समझ में आता है। आप एक इंटरफ़ेस आईपी का प्रयास और उपयोग कर सकते हैं और देख सकते हैं कि यह स्थानीय मशीन पर पुन: उत्पन्न करता है - हालांकि इसे भी अनुकूलित किया जा सकता है। सर्वर पर TcpTimedWaitDelay को 30 सेकंड (http://msdn.microsoft.com/en-us/library/ms819739.aspx) पर सेट करने पर भी एक नज़र डालें, यदि यह संभव है –

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