के साथ पहले से ही उपयोग में पता है मैंने एक सर्वर लिखा है जो टीसीपी कनेक्शन और उससे जुड़े क्लाइंट को इनकमिंग करने के लिए सुन रहा है। जब मैं सर्वर को बंद करता हूं और उसी पोर्ट पर इसे पुनरारंभ करता हूं, तो मुझे कभी-कभी त्रुटि संदेश (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() का उपयोग करने से पहले की कोशिश की है, लेकिन यह एक ही प्रभाव नहीं पड़ा। जब यह त्रुटि आई, तो मैं सर्वर को उसी पोर्ट पर कुछ समय तक पुनरारंभ नहीं कर सकता। नेटवर्क को पुनरारंभ करने में मदद मिलती है, लेकिन यह स्थायी समाधान नहीं है।
मुझे क्या याद आ रही है?
किसी भी मदद की सराहना की जाएगी! :)
क्या आपके सर्वर कांटा बाल प्रक्रिया करता है? –
भी, क्या आप सुनिश्चित हैं कि सॉकेट TIME_WAIT स्थिति में है? ऐसा होने पर आप 'netstat -ap' आउटपुट को पकड़ना चाहेंगे। –
सैम, आपके इनपुट के लिए बहुत बहुत धन्यवाद! इससे मुझे मेरी समस्या का हल ढूंढने में मदद मिली। यह पता चला कि मैंने स्वीकार्य के लिए पुन: उपयोग पता विकल्प सेट किया है, लेकिन अन्य सभी कनेक्शनों के लिए नहीं। फिर, आपकी मदद के लिए बहुत बहुत धन्यवाद! – Alexander