李sir_Blog

博客园 首页 联系 订阅 管理
  705 随笔 :: 58 文章 :: 134 评论 :: 193万 阅读
  boost::asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。与ACE不同的是,它并没有提供一个网络框架,而是采取组件的方式来提供应用接口。但是对于常见的情况,采用一个好用的框架还是能够简化开发过程,特别是asio的各个异步接口的用法都相当类似。
  受到 SP Server 框架的影响,我使用asio大致实现了一个多线程的半异步半同步服务器框架,以下是利用它来实现一个Echo服务器:

1. 实现回调:
  1. static void onSessionStarted(RequestPtr const& request, ResponsePtr const& response) {
  2.    request->setReadMode(Session::READ_LN); // 设置为行读取
  3. }
  4. static void onSession(RequestPtr const& request, ResponsePtr const& response) {
  5.    print(request->message()); //打印收到的消息
  6.    response->addReply(request->message()); //回送消息
  7.    response->close();
  8. }
复制代码
说明:close()是一个关闭请求,它并不马上关闭Session,而是等待所有与该Session相关的异步操作全部结束后才关闭。

2. 一个单线程的Echo服务器:
  1. void server_main() {
  2. unsigned short port = 7;
  3. AsioService svc;
  4. AsioTcpServer tcp(svc, port);
  5. svc.callbacks().sessionStarted = &onSessionStarted;
  6. svc.callbacks().sessionHandle = &onSession;
  7. svc.run();
  8. }
复制代码
3. 一个多线程的Echo服务器(半异步半同步:一个主线程,4个工作者线程)
  1. void server_main2() {
  2. unsigned short port = 7;
  3. int num_threads = 4;
  4. AsioService svc;
  5. AsioService worker(AsioService::HAS_WORK);
  6. AsioTcpServer tcp(svc, port);
  7. svc.callbacks().sessionStarted = worker.wrap(&onSessionStarted);
  8. svc.callbacks().sessionHandle = worker.wrap(&onSession);
  9. AsioThreadPool thr(worker, num_threads);
  10. svc.run();
  11. }
复制代码
  有了这样一个思路,实现起来就很容易了。重点是以下两点:
  1。缓冲区的管理与内存池的使用
  2。为了保证Session的线程安全,必须要设置一个挂起状态。
     
     还有一个好处,就是完全隔绝了asio的应用接口,不用再忍受asio漫长的编译时间了。代码就不贴在这里了,有兴趣的可以通过email 探讨。(说明,这里只提出一个思路,不再提供源代码,请各位见谅)
posted on   李sir  阅读(5346)  评论(2编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示