2011-01-15 13 views
5

kullanarak durdurma Daha büyük bir yazılım için küçük bir sunucu döngüsü geliştiriyorum, ancak bunu yapmak istediğim gibi çalışmıyor. Ben konuyu şu şekilde başlatmakDişli sunucu döngüsünü Boost :: Asio

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))); 

Ama problem

".quit" kullanıcı tipleri I yazılımı bu dişli sunucu döngüyü durdurmak istiyor

"sunucu" durduruluyor. Ne olursa olsun ben iplik kesme durumunda, yuva kapatmak ve/veya alıcı ya da sadece programın Boost kırmak hata atıyor:

Bad file descriptor 

Her zaman oluşur ama çoğu yok ve bu sorunu gidermek istiyoruz ve sadece görmezden gelmek değil.

Bunu nasıl kapatmam konusunda yardımcı olabilir misiniz clean?

+0

bir hata ayklayc ve istisnası atılır nerede olduğunu söyler eğer yararlı olacaktır. "Boost :: system :: system_error" komutunu "boost :: system :: errc :: bad_file_descriptor" hata kodu ile atayabilen çoklu asio yöntemleri vardır. –

cevap

2

Tipik sunucuları yazılır kullanılarak asenkron yöntemler

  • async_accept
  • async_read
  • async_write

bu durumda kapatma önerilen teknik tüm bekleyen asenkron operasyon stop için io_service olan ' s olay işleme döngüsü. Eğer bu sizin sorunun nerede olduğunu gönderdiniz sınırlı koduna göre bana belli değil ~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.

özel dikkat gerektiğini unutmayın, Elinizde ne fazla kod gönderme veya çalışan öneririm valgrind altında büyük olasılıkla bazı sorunları ortaya çıkaracaktır.

Sana bulabileceği bir kaç gün önce bir similar question cevap kullanışlı

+0

Merhaba Sam, cevabınız için teşekkürler! Soruyu bugün Google aramada da buldum, ancak bu yöntemi kullanmam gerektiğinden emin değildim. Ama ben bir göz atacağım, uyumsuz hale getireceğim ve deneyimlerimi buraya yazacağım. – Paul

+0

Mükemmel çalışır. Alıcıyı bağlayabileceğinizi ve io_service.stop(); – Paul

+0

@Paul harika! Sevindim sana yardım edebilirim. –