我使用boost asio来处理每个线程的会话,如下所示:
Server::Server(ba::io_service& ioService, int port): ioService_(ioService), port_(port)
{
ba::ip::tcp::acceptor acceptor(ioService_, ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port_));
for (;;)
{
socket_ptr sock(new ba::ip::tcp::socket(ioService_));
acceptor.accept(*sock);
boost::thread thread(boost::bind(&Server::Session, this, sock));
}
}
void Server::Session(socket_ptr sock)
{
const int max_length = 1024;
try
{
char buffer[256] = "";
// HandleRequest() function performs async operations
if (HandleHandshake(sock, buffer))
HandleRequest(sock, buffer);
ioService_.run();
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
std::cout << "Session thread ended \r\n"; // THIS LINE IS NEVER REACHED
}
在Server :: Session()中,我在某些时候使用async_read_some()和async_write()函数执行async io。 一切正常,为了使其工作,我必须在我的spawn线程中调用ioService_.run(),否则Server :: Session()函数退出并且它不处理所需的io工作。
问题是从我的线程调用的ioService_.run()将导致线程根本不退出,因为同时其他请求来到我的侦听服务器套接字。
我最终得到的是线程启动和处理现在的会话但从不释放资源(结束)。使用这种方法时,是否可以只使用一个boost :: asio :: io_service?
答案 0 :(得分:1)
我相信您正在寻找run_one()
或poll_one()
这将允许您让线程执行就绪处理程序(poll)或等待处理程序(运行)。通过只处理一个,您可以选择在退出线程之前执行多少。与执行所有处理程序的run()
相反,直到io_service
停止。 poll()
在处理完所有当前准备好的文件后停止的地方。
答案 1 :(得分:0)
我在这里构建处理连接的方式很糟糕。 关于如何设计你的asio服务器(由asio创建者制作)有一个很好的视频演示 Thinking Asynchronously: Designing Applications with Boost Asio