2011-01-15 9 views
5

Ich entwickle eine winzige Server-Schleife für eine größere Software, aber es funktioniert nicht so, wie ich es möchte.Gestoppte Thread-Server-Schleife mit Boost :: Asio

Wenn der Benutzer in ".quit" Ich die Software wollen diese Gewinde Server Schleife stoppen:

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

ich den Faden auf folgende Weise starten:

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

Aber ich habe Probleme stoppe den "Server". Egal, ob ich den Faden, schließen Sie die Buchse und/oder der Akzeptor oder brechen Sie das Programm-Boost führt den Fehler unterbrechen:

Bad file descriptor 

Es ist nicht tritt jedes Mal, aber oft, und ich möchte, dass Problem beheben und ignoriere es nicht einfach.

Können Sie mir helfen, wie Sie das herunterfahren sauber?

+0

es wäre hilfreich, wenn Sie einen Debugger anhängen könnte und uns sagen, wo die Ausnahme ausgelöst wird. Es gibt mehrere Asio-Methoden, die einen 'boost :: system :: system_error' mit dem Fehlercode boost :: system :: errc :: bad_file_descriptor auslösen können. –

Antwort

2

Typischerweise Server geschrieben wird unter Verwendung asynchrone Methoden

  • async_accept
  • async_read
  • async_write

in welchem ​​Fall die vorgeschlagene Technik zur Abschaltung aller anstehenden asynchronen Operationen stop ist die io_service ' s Ereignisverarbeitungsschleife. Beachten Sie, dass Sie besonderes Augenmerk auf die ~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.

zahlen sollte Es ist nicht offensichtlich für mich, basierend auf dem begrenzten Code, den Sie geschrieben haben, wo Ihr Problem ist, würde ich vorschlagen, mehr Code veröffentlichen oder Laufen, was Sie haben unter valgrind, da es wahrscheinlich einige Probleme ergeben wird.

ich vor ein paar Tagen ein similar question antwortete, finden Sie vielleicht nützlich

+0

Hallo Sam, danke für deine Antwort! Ich habe die Frage heute auch in meiner Google-Suche gefunden, war mir aber nicht wirklich sicher, ob ich diese Methode verwenden soll. Aber ich schaue es mir an, mache es asynchron und schreibe meine Erfahrungen hier. – Paul

+0

Arbeitete perfekt. Es war wichtig zu wissen, dass Sie den Akzeptor binden und mit Hilfe von io_service.stop() sicher beenden können; – Paul

+0

@Paul großartig! Ich bin froh, dass ich dir helfen kann. –