2010-11-16 22 views
10

के साथ पहले से ही उपयोग में पता है मैंने एक सर्वर लिखा है जो टीसीपी कनेक्शन और उससे जुड़े क्लाइंट को इनकमिंग करने के लिए सुन रहा है। जब मैं सर्वर को बंद करता हूं और उसी पोर्ट पर इसे पुनरारंभ करता हूं, तो मुझे कभी-कभी त्रुटि संदेश (EADDRINUSE) बाइंड (...) (त्रुटि कोड: 98 पर लिनक्स) कॉल करते समय मिलता है। यह तब भी होता है जब मैं सॉकेट का पुन: उपयोग करने का विकल्प निर्धारित कर रहा हूं।बूस्ट एएसओ स्वीकार्य

त्रुटि हर समय नहीं होती है, लेकिन ऐसा लगता है कि यह अक्सर होता है जब क्लाइंट सर्वर से कनेक्ट होते हैं और डेटा बंद करते समय डेटा भेजते हैं। मुझे लगता है कि समस्या यह है कि सर्वर बंद होने पर कनेक्शन लंबित हैं (संबंधित विषय: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait)।

सर्वर की तरफ, मैं boost :: asio :: ip :: tcp :: acceptor का उपयोग कर रहा हूं। मैं इसे "reuse_address" विकल्प के साथ शुरू करता हूं (http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html देखें)। यहाँ कोड का टुकड़ा है:

using boost::asio::ip::tcp; 
acceptor acceptor::acceptor(io_service); 
endpoint ep(ip::tcp::v4(), port); 
acceptor.open(ep.protocol()); 
acceptor.set_option(acceptor::reuse_address(true)); 
acceptor.bind(ep); 
acceptor.listen(); 

स्वीकर्ता के साथ बंद कर दिया है:

acceptor.close(); 

मैं भी acceptor.cancel() का उपयोग करने से पहले की कोशिश की है, लेकिन यह एक ही प्रभाव नहीं पड़ा। जब यह त्रुटि आई, तो मैं सर्वर को उसी पोर्ट पर कुछ समय तक पुनरारंभ नहीं कर सकता। नेटवर्क को पुनरारंभ करने में मदद मिलती है, लेकिन यह स्थायी समाधान नहीं है।

मुझे क्या याद आ रही है?

किसी भी मदद की सराहना की जाएगी! :)

+1

क्या आपके सर्वर कांटा बाल प्रक्रिया करता है? –

+1

भी, क्या आप सुनिश्चित हैं कि सॉकेट TIME_WAIT स्थिति में है? ऐसा होने पर आप 'netstat -ap' आउटपुट को पकड़ना चाहेंगे। –

+1

सैम, आपके इनपुट के लिए बहुत बहुत धन्यवाद! इससे मुझे मेरी समस्या का हल ढूंढने में मदद मिली। यह पता चला कि मैंने स्वीकार्य के लिए पुन: उपयोग पता विकल्प सेट किया है, लेकिन अन्य सभी कनेक्शनों के लिए नहीं। फिर, आपकी मदद के लिए बहुत बहुत धन्यवाद! – Alexander

उत्तर

1

ये मूल रूप से प्रश्न के लिए एक टिप्पणी थीं।


क्या आपके सर्वर का कांटा बाल प्रक्रिया करता है? साथ ही, क्या आप सुनिश्चित हैं कि सॉकेट TIME_WAIT स्थिति में है? जब यह होता है तो netstat -ap आउटपुट को पकड़ना पड़ सकता है जब यह होता है

0

जब आप इन समस्याओं को "बलपूर्वक" हल करते हैं, तो ऐसा लगता है कि आप अपने सिर पर समस्याएं बुला रहे हैं, है ना?

एक कारण है कि डिफ़ॉल्ट व्यवहार के लिए आपको प्रतीक्षा करने की आवश्यकता होती है, अन्यथा नेटवर्क उदाहरण के लिए पिछले कनेक्शन से एसीके को नए कनेक्शन के लिए एसीके होने से भ्रमित कर सकता है।

मैं इस "समाधान" को मेरी टीम में रिलीज बिल्ड में शामिल करने की अनुमति नहीं दूंगा।

याद रखें, जब त्रुटि की संभावना बहुत कम है, परीक्षण बेहद मुश्किल है!

+0

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

+0

फिर, मैंने सर्वर को फिर से शुरू किया। हालांकि, सर्वर एक ही बंदरगाह पर सुनना शुरू नहीं कर सका क्योंकि ग्राहकों के कनेक्शन का पुन: उपयोग विकल्प नहीं था और बंदरगाह अभी भी आरक्षित था।सवाल यह है कि मैं एक ऐसे पते का पुन: उपयोग कैसे कर सकता हूं जो पहले से ही ऑपरेटिंग सिस्टम द्वारा उपयोग में चिह्नित है, भले ही सभी कनेक्शन पुन: उपयोग विकल्प के बिना सही ढंग से बंद हो गए हों? – Alexander

+3

बस प्रतीक्षा करने के लिए स्वीकार करना (जो काफी समय ले सकता है) सर्वर के लिए स्वीकार्य समाधान नहीं है। मुझे विश्वास था (और अभी भी विश्वास है) कि इस मामले में पुन: उपयोग विकल्प स्थापित करना उचित है। हालांकि, मुझे वैकल्पिक समाधान में बहुत दिलचस्पी है और यदि आप एक को प्रदान या संकेत दे सकते हैं तो आपको खुशी होगी। (एक तरफ ध्यान दें: उपरोक्त प्रस्तावित समाधान बहुत अच्छी तरह से काम करता है। हम सर्वर का व्यापक रूप से उपयोग करते हैं और कनेक्शन से संबंधित किसी भी समस्या का सामना नहीं करते हैं। बेशक, यह गारंटी नहीं देता है कि यह 100% त्रुटि मुक्त है।) – Alexander

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