2011-01-15 21 views
5

का उपयोग कर थ्रेडेड सर्वर लूप को रोकना मैं एक बड़े सॉफ्टवेयर के लिए एक छोटा सर्वर लूप विकसित कर रहा हूं लेकिन यह काम नहीं करता है क्योंकि मैं इसे करना चाहता हूं।Boost :: Asio

".quit" में उपयोगकर्ता प्रकार मैं सॉफ्टवेयर इस थ्रेड सर्वर पाश बंद करना चाहते हैं जब:

try { 

while (true) { 
     acceptor.accept(socket); 
     const size_t buffersize = 1024; 
     char data[buffersize+1] = {0}; 
     data[socket.read_some(boost::asio::buffer(data,buffersize))] = '\0'; // Write data & place terminator 
     boost::thread asyncWriting(boost::bind(&myClass::writeToFile, this)); 
     socket.close(); 
} 

} catch(const boost::system::system_error& e) { 
    cout << "Boost System Error: " << e.what() << endl; 
} 

मैं धागा निम्नलिखित तरीके से शुरू:

serverThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&myClass::startServer, this))); 

लेकिन मैं समस्या है "सर्वर" को रोकना। कोई फर्क नहीं पड़ता अगर मैं धागा बाधा डालते हैं, सॉकेट बंद करने और/या स्वीकर्ता या सिर्फ कार्यक्रम बूस्ट तोड़ने त्रुटि फेंकता है:

Bad file descriptor 

यह हर बार होता है नहीं होता है लेकिन अक्सर और मुझे लगता है कि इस मुद्दे को ठीक करना चाहते हैं और न सिर्फ इसे अनदेखा करें।

क्या आप इसे साफ़ को बंद करने में मेरी सहायता कर सकते हैं?

+0

यदि आप एक डिबगर देते हैं और जहां अपवाद फेंक दिया है हमें यह बताएं कि यह उपयोगी होगा। कई एएसओ विधियां हैं जो 'boost :: system :: system_error' को 'boost :: system :: errc :: bad_file_descriptor' के त्रुटि कोड के साथ फेंक सकती हैं। –

उत्तर

2

आमतौर पर सर्वर लिखा जाता है अतुल्यकालिक तरीकों का उपयोग कर

  • async_accept
  • async_read
  • async_write

जिस स्थिति में बंद करने के लिए सुझाव दिया तकनीक सभी लंबित अतुल्यकालिक संचालन io_servicestop है ' एस घटना प्रसंस्करण पाश। ध्यान दें कि आप ~io_servicedocumentation

The destruction sequence described above permits programs to simplify their resource management by using shared_ptr<>. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a shared_ptr to the object would be bound into the handlers for all asynchronous operations associated with it.

यह सीमित कोड है कि आप जहां आपकी समस्या है पोस्ट किया है के आधार पर मेरे लिए स्पष्ट नहीं है करने के लिए विशेष ध्यान देना चाहिए, मैं और अधिक कोड पोस्ट करने या चल रहा है तुम्हारे पास क्या है सुझाव देंगे valgrind के तहत यह संभवतः कुछ समस्याओं का पर्दाफाश करेगा।

मैं एक similar question जवाब कुछ दिन पहले कि आप देख सकते हैं उपयोगी

+0

हाय सैम, आपके उत्तर के लिए धन्यवाद! मुझे आज भी मेरी Google खोज में यह प्रश्न मिला लेकिन वास्तव में यह सुनिश्चित नहीं था कि मुझे इस विधि का उपयोग करना चाहिए या नहीं। लेकिन मैं एक नज़र डालूंगा, इसे अतुल्यकालिक बनाउंगा और यहां अपने अनुभव लिखूंगा। – Paul

+0

पूरी तरह से काम किया। यह जानना आवश्यक था कि आप स्वीकारकर्ता को बांध सकते हैं और इसे io_service.stop() की सहायता से सुरक्षित रूप से समाप्त कर सकते हैं; – Paul

+0

@Paul महान! खुशी है कि मैं आपकी मदद कर सकता हूँ। –

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