Boost Asio多线程TCP同步服务器
Boost Asio Multithreaded TCP Synchronous Server
我正在尝试创建一个tcp同步服务器。我的主线程将创建监听端口,传入的连接将由线程处理。
我代码:void WorkerThread(boost::shared_ptr< boost::asio::io_service > io_service)
{
io_service->run();
}
void Application::server()
{
boost::shared_ptr< boost::asio::io_service > io(
new boost::asio::io_service()
);
boost::shared_ptr< boost::asio::io_service::work > work(
new boost::asio::io_service::work(*io)
);
// Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR
boost::asio::ip::tcp::acceptor acceptor(*io);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 2198);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
// pool of threads
boost::thread_group worker_threads;
for(int x = 0; x < 5; ++x)
{
worker_threads.create_thread(boost::bind(&WorkerThread, io));
}
while(true)
{
boost::shared_ptr< boost::asio::ip::tcp::socket > socket(
new boost::asio::ip::tcp::socket( *io )
);
acceptor.accept(*socket);
processConnection(*socket);
socket->close();
}
io->stop();
worker_threads.join_all();
}
void Application::processConnection(boost::asio::ip::tcp::socket & socket)
{
boost::asio::streambuf request_buffer;
std::istream request_stream(&request_buffer);
// repsonse buffer
boost::asio::streambuf response_buffer;
std::ostream response_stream(&response_buffer);
boost::asio::read_until(socket, request_buffer, "</message>");
// process request_buffer into response_buffer
boost::asio::write(socket, response_buffer);
}
下面的操作使用多个客户端连接到服务器;但是,如果我删除线程池,它也可以工作。有人能解释一下为什么吗?我甚至需要线程池吗?
但是,如果我删除线程池,也可以工作。谁能解释一下为什么?我甚至需要线程池吗?
对于示例代码,您不需要线程池。不需要在您的上下文中调用io_service::run()
,请参阅文档
run()
功能阻塞,直到所有工作完成且没有更多的处理程序被调度,或者直到io_service
被调度停止。
您没有向io_service
添加任何处理程序,因此不需要调用run()
。如果您使用异步方法,如async_accept()
,那么您将需要run()
io_service
。
您可能会发现,如果您将boost的内容类型定义为
,那么您的代码会更容易阅读。例子typedef boost::asio::ip::tcp::socket TSocket;
这个没有直接的帮助,但是会有帮助
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 松弛原子与无同步情况下的记忆连贯性
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- gRPC cpp 异步服务器与同步服务器
- C++服务器上的线程同步
- 服务器和客户端之间的同步
- 如何制作具有同步数据读/写功能的多客户端服务器
- Boost Asio多线程TCP同步服务器
- Boost同步服务器客户端编译错误
- Boost Asio:关于教程的一些问题(同步日间服务器/客户端)