2011-02-15 10 views
7

मेरे पास एक बूस्ट :: एएसओ आधारित सर्वर है जो ठीक काम करता है, सिवाय इसके कि मैं एक चेक जोड़ने की कोशिश कर रहा हूं कि एक ही बंदरगाह पर कनेक्शन स्वीकार नहीं कर रहा है। यदि मैं दो सर्वर बना देता हूं, तो उनमें से एक लगातार कनेक्शन स्वीकार करता है, लेकिन दूसरा किसी भी त्रुटि की रिपोर्ट नहीं करता है (दोनों में से प्रत्येक कनेक्शन यादृच्छिक प्रतीत होता है)।boost :: asio server - सर्वर पोर्ट को सुनने में विफलता का पता लगाएं

सर्वर वर्ग के प्रासंगिक बिट (यह जो बनाने के लिए कनेक्शन प्रकार के लिए) एक आधार वर्ग और typedefs जो स्वीकार कर लिया है (का उपयोग करता है एक टेम्पलेट है) कर रहे हैं:

 MessageServer (boost::asio::io_service &io, unsigned short port_num) 
      : BaseServerType (io), acceptor_ (io, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port_num)) { 
      Listen(); 
     } 
     void Listen() { 
      boost::system::error_code ec; 
      acceptor_.listen (boost::asio::socket_base::max_connections, ec); 

      if (!ec) { 
       start_accept(); 
      } else { 
       // not reached even if a separate process 
       // is already listening to that port 
       connection_pointer new_connection; 
       BaseServerType::Accepted (new_connection); 
      } 
     } 

    private: 
     void start_accept() { 
      connection_pointer new_connection (CreateConnection (acceptor_.io_service())); 

      acceptor_.async_accept (new_connection -> Socket(), 
            boost::bind (&MessageServer::handle_accept, this, new_connection, 
                boost::asio::placeholders::error)); 
     } 

     void handle_accept (connection_pointer new_connection, const boost::system::error_code &error) { 
      if (!error) { 
       BaseServerType::Accepted (new_connection); 
       new_connection -> Start(); 
       start_accept(); 
      } else { 
       // never reached 
       new_connection.reset(); 
       BaseServerType::Accepted (new_connection); 
      } 
     } 

     boost::asio::ip::tcp::acceptor acceptor_; 

acceptor.listen() नहीं करता है ' या तो फेंक नहीं।

बूस्ट :: एएसओ में रिपोर्ट किए गए सर्वर पोर्ट को सुनने में विफलता कैसी है?

उत्तर

9

boost::asio::ip::tcp::acceptor आपके द्वारा उपयोग किए जाने वाले निर्माता का डिफ़ॉल्ट तर्क reuse_address = true है। यह SO_REUSEADDR सॉकेट विकल्प सेट करता है। इस विकल्प को अक्षम करने से आपको acceptor.listen() पर त्रुटि प्राप्त होगी। more info about SO_REUSEADDR here

ध्यान रखें कि इस विकल्प treated differently on windows and linux

+0

यदि मैं ऊपर वर्ण का अनुवाद करता हूं, तो यहां कोड है। संदेश सर्वर (boost :: asio :: io_service & io, हस्ताक्षरित लघु पोर्ट_num) : बेससेवर टाइप (io) , स्वीकार्य_ (io, boost :: asio :: ip :: tcp :: endpoint (boost :: asio :: ip: : टीसीपी :: v4(), port_num, झूठा)) { सुनो(); } ... कोशिश करें { सर्वर = नया संदेश सर्वर (io_service_, 5000); } पकड़ें (std :: अपवाद कॉन्स और पूर्व) { printf ("बाध्य त्रुटि:% s \ n", ex.what()); } – Hill

0

त्रुटि आप boost::asio::ip::tcp::acceptor::bind() से thrown or returned होगा चाहते हैं। constructor जो आप उपयोग कर रहे हैं, वही व्यवहार प्रदर्शित करेगा, मेरा सुझाव है कि आप अपने उदाहरण को पुन: उत्पन्न करने वाले छोटे से नीचे उबालें। यह मेरे लिए स्पष्ट नहीं है कि आप अपने MessageServer सीटीओआर से हटाए गए अपवादों को कैसे संभालेंगे।

+0

किसी भी कन्स्ट्रक्टर के साथ जो फेंक सकता है, जो भी सर्वर बनाता है, कन्स्ट्रक्टर को या तो इसे पुनर्प्राप्त करने योग्य/पकड़ने में लपेटता है, या अगर यह नहीं होता है तो बाहरी क्षेत्र में घूमने दें। –

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