
int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: chat_server <port> [<port> ...]\n"; return 1; } boost::asio::io_service io_service; chat_server_list servers; for (int i = 1; i < argc; ++i) { using namespace std; // For atoi. tcp::endpoint endpoint(tcp::v4(), atoi(argv[i])); chat_server_ptr server(new chat_server(io_service, endpoint)); servers.push_back(server); } io_service.run(); /************** just like this, so io_service.run(); is not needed. boost::thread io_thread(boost::bind(&boost::asio::io_service::run, &io_service)); std::string line; while(getline(std::cin, line)) { if (line == "exit") { /* do what? now i am using io_service.stop(); */ break; } } io_thread.join(); ***************/ } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } 2010/3/11 l.jay Yuan <pass86@gmail.com>:
can you code the Boost.Asio chat server example for exit by a command? if you can, my problem solved.
2010/3/10 Igor R <boost.lists@gmail.com>:
thanks everyone, i solved my problem. just use io_service.stop() instead of acceptor.close() and socket.close(). maybe i must to research the implementation.
It's not a solution but just a "dirty" workaround: by stopping io_service you prevent the further invocation of handlers. I guess some of your handlers used to get called after destruction of the object they were bound to. You can avoid this situation by binding the handlers to shared_from_this(). _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users