Boost asio入门学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。文章中有连接失效或是技术谬误的地方,请与我联系。 https://blog.csdn.net/luchengtao11/article/details/82996126

Timer1:使用一个同步计时器

 
  1. #include <iostream>

  2. #include "boost/asio.hpp"

  3. int main()

  4. {

  5. boost::asio::io_context io;

  6. boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));

  7. t.wait();

  8. std::cout << "Hello,world!" << std::endl;

  9. return 0;

  10. }

所谓的同步,就是指t.wait必须等待五秒才会向下执行。

Timer2:使用一个异步计时器

 
  1. #include <iostream>

  2. #include "boost/asio.hpp"

  3. void print(const boost::system::error_code&)

  4. {

  5. std::cout << "Hello world!" << std::endl;

  6. }

  7. int main()

  8. {

  9. boost::asio::io_context io;

  10. boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));

  11. t.async_wait(&print);

  12. std::cout << "Hehe!" << std::endl;

  13. io.run();

  14. return 0;

  15. }

异步是指:上述程序并不会在t.async_wait(&print)处阻塞,而是继续运行,等到计时器计满5秒,才会调用print。上述程序的运行结果就是,先输出Hehe,再输出Hello world!。

Timer3:为handle绑定参数

 
  1. #include <iostream>

  2. #include "boost/asio.hpp"

  3. #include "boost/bind.hpp"

  4. void print(const boost::system::error_code&,boost::asio::steady_timer *t,int *count)

  5. {

  6. if (*count < 5)

  7. {

  8. std::cout << *count << std::endl;

  9. ++(*count);

  10. t->expires_at(t->expiry() + boost::asio::chrono::seconds(1));//设置新的过期时间

  11. t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));//为print邦定参数,转换为函数对象

  12. }

  13. }

  14. int main()

  15. {

  16. boost::asio::io_context io;

  17. int count = 0;

  18. boost::asio::steady_timer t(io, boost::asio::chrono::seconds(1));

  19. t.async_wait(boost::bind(print,boost::asio::placeholders::error,&t,&count));

  20. io.run();

  21. std::cout << "Final count is " << count << std::endl;

  22. return 0;

  23. }

Timer4:使用一个成员函数作为handler

 
  1. #include <iostream>

  2. #include "boost/asio.hpp"

  3. #include "boost/bind.hpp"

  4. class printer

  5. {

  6. public:

  7. printer(boost::asio::io_context& io)

  8. :timer_(io, boost::asio::chrono::seconds(1)),

  9. count_(0)

  10. {

  11. timer_.async_wait(boost::bind(&printer::print, this));

  12. }

  13. ~printer()

  14. {

  15. std::cout << "Final count is " << count_ << std::endl;

  16. }

  17. void print()

  18. {

  19. if (count_ < 5)

  20. {

  21. std::cout << count_ << std::endl;

  22. ++count_;

  23. timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));

  24. timer_.async_wait(boost::bind(&printer::print, this));

  25. }

  26. }

  27. private:

  28. boost::asio::steady_timer timer_;

  29. int count_;

  30. };

  31. int main()

  32. {

  33. boost::asio::io_context io;

  34. printer p(io);

  35. io.run();

  36. return 0;

  37. }

与之前实例实现的功能一致,只不过更巧妙一些。the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling io_context::run(). Consequently, calling io_context::run() from only one thread ensures that callback handlers cannot run concurrently.即,回调函数只能被一个线程调用,不能并行。

单线程有以下局限:

  • 如果handle非常耗时,将会造成可怜的响应速度。
  • 不能针对多核处理器进行扩展优化。

Timer5:多线程的同步Handlers

 
  1. #include <iostream>

  2. #include "boost/asio.hpp"

  3. #include "boost/thread/thread.hpp"

  4. #include "boost/bind.hpp"

  5. class printer

  6. {

  7. public:

  8. printer(boost::asio::io_context& io)

  9. :strand_(io),

  10. timer1_(io, boost::asio::chrono::seconds(1)),

  11. timer2_(io,boost::asio::chrono::seconds(1)),

  12. count_(0)

  13. {

  14. timer1_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print1, this))); //邦定在同一个strand对象上的handler不能并发

  15. timer2_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print2, this)));

  16. }

  17. ~printer()

  18. {

  19. std::cout << "Final count is " << count_ << std::endl;

  20. }

  21. void print1()

  22. {

  23. if(count_ < 10)

  24. {

  25. std::cout << "Timer 1: " << count_ << std::endl;

  26. ++count_;

  27. timer1_.expires_at(timer1_.expiry() + boost::asio::chrono::seconds(1));

  28. timer1_.async_wait(boost::asio::bind_executor(strand_,

  29. boost::bind(&printer::print1, this)));

  30. }

  31. }

  32. void print2()

  33. {

  34. if (count_ < 10)

  35. {

  36. std::cout << "Timer 2: " << count_ << std::endl;

  37. ++count_;

  38. timer2_.expires_at(timer2_.expiry() + boost::asio::chrono::seconds(1));

  39. timer2_.async_wait(boost::asio::bind_executor(strand_,

  40. boost::bind(&printer::print2, this)));

  41. }

  42. }

  43. private:

  44. boost::asio::io_context::strand strand_;

  45. boost::asio::steady_timer timer1_;

  46. boost::asio::steady_timer timer2_;

  47. int count_;

  48. };

  49. int main()

  50. {

  51. boost::asio::io_context io;

  52. printer p(io);

  53. boost::thread t(boost::bind(&boost::asio::io_context::run, &io));

  54. io.run();

  55. t.join();//等待子线程运行完毕

  56. return 0;

  57. }

daytime1:实现一个同步的TCP daytime客户端

 
  1. #include <iostream>

  2. #include<boost/array.hpp>

  3. #include "boost/asio.hpp"

  4. using boost::asio::ip::tcp;

  5. int main(int argc,char * argv[])

  6. {

  7. try

  8. {

  9. boost::asio::io_context io_context; //All programs that use asio need to have at least one io_context object.

  10. tcp::resolver resolver(io_context);

  11. std::string host = "127.0.0.1";//specify the host

  12. //resolver需要一个query对象,并将query转换为a list of endpoints

  13. //host name,也就是IP地址

  14. //the name of service,也就是端口...

  15. tcp::resolver::query query(tcp::v4(), host, "13");

  16. // tcp::resolver::query query(tcp::v4(),argv[1], "13");

  17. tcp::resolver::results_type endpoints = resolver.resolve(query);

  18. tcp::socket socket(io_context);

  19. boost::asio::connect(socket, endpoints);

  20. for (;;)

  21. {

  22. boost::array<char, 128>buf;

  23. boost::system::error_code error;

  24. size_t len = socket.read_some(boost::asio::buffer(buf), error);

  25. if (error == boost::asio::error::eof)

  26. {

  27. break;//连接关闭

  28. }

  29. else if (error)

  30. {

  31. throw boost::system::system_error(error);

  32. }

  33. std::cout.write(buf.data(), len);

  34. }

  35. }

  36. catch (const std::exception& e)

  37. {

  38. std::cerr << e.what() << std::endl;

  39. }

  40. return 0;

  41. }

daytime2:实现一个同步的TCP daytime 服务端

 
  1. #include <ctime>

  2. #include <iostream>

  3. #include <string>

  4. #include <boost/asio.hpp>

  5. using boost::asio::ip::tcp;

  6. std::string make_daytime_string()

  7. {

  8. using namespace std;

  9. time_t now = time(0);

  10. return ctime(&now);

  11. }

  12. int main()

  13. {

  14. try

  15. {

  16. boost::asio::io_context io_context;

  17. tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));

  18. for (;;)

  19. {

  20. tcp::socket socket(io_context);

  21. acceptor.accept(socket);

  22. std::string message = make_daytime_string();

  23. boost::system::error_code igored_error;

  24. boost::asio::write(socket, boost::asio::buffer(message), igored_error);

  25. }

  26. }

  27. catch (const std::exception& e)

  28. {

  29. std::cerr << e.what() << std::endl;

  30. }

  31. }

daytime3:一个异步tcp daytime的服务端

 
  1. #include <ctime>

  2. #include <iostream>

  3. #include <string>

  4. #include <boost/asio.hpp>

  5. #include <boost/enable_shared_from_this.hpp>

  6. #include <boost/bind.hpp>

  7. using boost::asio::ip::tcp;

  8. std::string make_daytime_string()

  9. {

  10. using namespace std;

  11. time_t now = time(0);

  12. return ctime(&now);

  13. }

  14. class tcp_connection :public boost::enable_shared_from_this<tcp_connection>

  15. {

  16. public:

  17. typedef boost::shared_ptr<tcp_connection> pointer;

  18. static pointer create(boost::asio::io_context&io_context)

  19. {

  20. return pointer(new tcp_connection(io_context));

  21. }

  22. tcp::socket & socket()

  23. {

  24. return socket_;

  25. }

  26. void start()

  27. {

  28. message_ = make_daytime_string();

  29. boost::asio::async_write(socket_, boost::asio::buffer(message_), boost::bind(&tcp_connection::handle_write, shared_from_this(),

  30. boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

  31. }

  32. private:

  33. tcp_connection(boost::asio::io_context&io_context)

  34. :socket_(io_context)

  35. {

  36. }

  37. void handle_write(const boost::system::error_code, size_t)

  38. {

  39. }

  40. tcp::socket socket_;

  41. std::string message_;

  42. };

  43. class tcp_server

  44. {

  45. public:

  46. tcp_server(boost::asio::io_context&io_context)

  47. :acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))

  48. {

  49. start_accept();

  50. }

  51. private:

  52. void start_accept()

  53. {

  54. tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_executor().context());

  55. acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error));

  56. //此处不阻塞,直接返回,当有连接到达时,调用handle_accept

  57. }

  58. void handle_accept(tcp_connection::pointer new_connection,

  59. const boost::system::error_code& error)

  60. {

  61. if (!error)

  62. {

  63. new_connection->start();

  64. }

  65. start_accept();

  66. }

  67. tcp::acceptor acceptor_;

  68. };

  69. int main()

  70. {

  71. try

  72. {

  73. boost::asio::io_context io_context;

  74. tcp_server server(io_context);

  75. io_context.run();

  76. }

  77. catch (const std::exception& e)

  78. {

  79. std::cerr << e.what() << std::endl;

  80. }

  81. }

Boost asio 定时器相关推荐

  1. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...

  2. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  3. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  4. Boost::asio概览

    Boost::asio核心的概念和功能 asio的最核心的功能是用于异步的IO通信, 比如通过文件 网络或者控制台等. asio提供了一系列的工具来处理这种长时间的IO操作, 而且执行这些操作不需要依 ...

  5. boost::asio::deadline_timer(理解)

    并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...

  6. Boost ASIO proactor 浅析

    Boost ASIO proactor 浅析 前情提要: Boost asio 的socket的异步非阻塞模式才有的是proactor模式,当IO操作介绍后回调相应的处理函数.ASIO在Linux平台 ...

  7. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  8. 史上最强c++代码——“boost::asio”

    在C++编程领域,有一段备受推崇的代码--"boost::asio",它被认为是世界上最强大的C++代码之一.它是一个跨平台的网络编程库,提供了异步I/O.TCP/UDP套接字.定 ...

  9. Boost.Asio技术文档

    文章来源:http://blog.csdn.net/henreash/article/details/7469707 Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手 ...

最新文章

  1. 【数据结构】关键路径
  2. webpack入门学习手记(一)
  3. python 数据分析学什么-如何学习Python数据分析呢?老男孩Python培训
  4. [SQL] 外卖系统数据库设计
  5. 云服务时代,你是否没穿内裤在到处逛啊!
  6. POJ1236 Network of Schools
  7. pytorch: torch.Tensor.view ------ reshape
  8. bug6-_SymbolicException: Inputs to eager execution function cannot be Keras symbolic
  9. Docker镜像优化:从1.16GB到22.4MB,真强!
  10. tips to understand kexec
  11. 上新:视频加密功能增加防录屏(随机水印)功能
  12. 自学web前端课程大纲分享,适合所有人学习
  13. uniapp实现上传图片
  14. pta:人民币与美元汇率兑换程序(python)
  15. C++11 decay
  16. 北邮计算机学院4组,北邮信息与通信工程学院导师组介绍(十一)
  17. linux删除pdf密码
  18. EventLog Analyzer应用程序日志管理
  19. 海底捞市值蒸发2323亿关店300家,火锅“炼金术”还灵验吗?
  20. 台式电脑计算机怎么看是固态硬盘,台式电脑分别如何安装SSD(固态硬盘)详细图文教程!...

热门文章

  1. Linux C编程--进程介绍4--errno
  2. linux kernel makefile analysis
  3. 如何利用魔棒工具抠图_3秒搞定抠图!免费在线抠图工具
  4. oracle表行列权限,Oracle行列互换 横表和纵表
  5. java 变量分配_Java中成员变量分配在哪个空间?
  6. java一段时间后执行一块代码_java自带的ScheduledExecutorService定时任务正常执行一段时间后部分任务不执行...
  7. html文字变成汉堡插件,一组超酷汉堡包图标变形动画特效
  8. mysql构建镜像时写入密码_用Dockerfile手动创建mysql5.7主从镜像
  9. oracle缺少key xe.reg,【Oracle XE系列之一】Windows 7 64位安裝Oracle XE(32位)數據庫(REG_XE報錯、字符集、修改8080端口等)...
  10. python中ret是什么意思_数据结构图在python中的应用