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
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
: 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