摘于boost官网的几个例子, 做了点小修改, 笔记之.

同步客户端

  1. void test_asio_synclient()
  2. {
  3. typedef boost::asio::io_service IoService;
  4. // 该命名空间下有几个常用类: accetpt, resolver, endpoint, socket
  5. typedef boost::asio::ip::tcp TCP;
  6. try
  7. {
  8. IoService ios;
  9. boost::system::error_code error;
  10. // 1. 用解释器的方法, 常用来解析域名, 如
  11. // query("www.163.com","80"), 也可以 query("www.163.com","telnet")
  12. // echo          7/tcp
  13. // ftp           21/tcp                 # File Transfer Protocol (Control)
  14. // telnet        23/tcp                 # Virtual Terminal Protocol
  15. // smtp          25/tcp                 # Simple Mail Transfer Protocol
  16. // time          37/tcp  timeserver     # Time
  17. //      TCP::resolver resolver(ios);
  18. //      TCP::resolver::query query("127.0.0.1", "10000");
  19. //      TCP::resolver::iterator endpoint_iterator = resolver.resolve(query);
  20. //      TCP::resolver::iterator end;
  21. //      TCP::socket socket(ios);
  22. //      socket.connect(*endpoint_iterator, error);
  23. // 2. 用简便的方法
  24. TCP::socket socket(ios);
  25. TCP::endpoint endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 10000);
  26. socket.connect(endpoint, error);
  27. // 这里要判断一下, 否则没有连上会通过.
  28. if (error)
  29. throw boost::system::system_error(error);
  30. while(true)
  31. {
  32. // boost::array<char, 128> buf;
  33. std::vector<char> buf(128);
  34. size_t len = socket.read_some(boost::asio::buffer(buf), error);
  35. // 这是也要判断一下, 否则服务端运行断开, 这里会出现死循环.
  36. if (error == boost::asio::error::eof)
  37. break; // Connection closed cleanly by peer.
  38. else if (error)
  39. throw boost::system::system_error(error); // Some other error.
  40. // buf要注意控制大小。
  41. socket.write_some(boost::asio::buffer(buf, len), error);
  42. }
  43. }
  44. catch (std::exception& e)
  45. {
  46. PRINT_DEBUG(e.what());
  47. }
  48. }

同步服务端

  1. namespace
  2. {
  3. std::string make_daytime_string()
  4. {
  5. using namespace std; // For time_t, time and ctime;
  6. time_t now = time(0);
  7. return ctime(&now);
  8. }
  9. }
  10. void test_asio_synserver()
  11. {
  12. typedef boost::asio::io_service IoService;
  13. typedef boost::asio::ip::tcp TCP;
  14. try
  15. {
  16. IoService ios;
  17. /*
  18. *以下构造函数相当于以下步骤
  19. * basic_socket_acceptor<tcp> acceptor(io_service);
  20. * acceptor.open(tcp::v4());
  21. * acceptor.bind(tcp::endpoint(13));
  22. * acceptor.listen(0);//default
  23. */
  24. /*
  25. tcp::endpoint(端点)由以下三个部分组成
  26. 1. IP地址(address, address_v4, address_v6)
  27. 2. 端口号
  28. 3. 协议版本
  29. */
  30. TCP::acceptor acceptor(ios, TCP::endpoint(TCP::v4(), 13));
  31. for (;;)
  32. {
  33. TCP::socket socket(ios);
  34. acceptor.accept(socket);
  35. std::string message = make_daytime_string();
  36. boost::system::error_code ignored_error;
  37. boost::asio::write(socket,
  38. boost::asio::buffer(message),
  39. boost::asio::transfer_all(),
  40. ignored_error);
  41. PRINT_DEBUG(message);
  42. }
  43. }
  44. catch (std::exception& e)
  45. {
  46. std::cout << e.what() << std::endl;
  47. }
  48. }

异步服务端

  1. namespace
  2. {
  3. typedef boost::asio::io_service IoService;
  4. typedef boost::asio::ip::tcp TCP;
  5. std::string make_daytime_string()
  6. {
  7. using namespace std;
  8. time_t now = std::time(NULL);
  9. return ctime(&now);
  10. }
  11. class tcp_connection
  12. : public boost::enable_shared_from_this<tcp_connection>
  13. {
  14. public:
  15. typedef boost::shared_ptr<tcp_connection> pointer;
  16. static pointer create(IoService& io_service)
  17. {
  18. return pointer(new tcp_connection(io_service));
  19. }
  20. TCP::socket& socket()
  21. {
  22. return socket_;
  23. }
  24. void start()
  25. {
  26. message_ = make_daytime_string();
  27. boost::asio::async_write(
  28. socket_,
  29. boost::asio::buffer(message_),
  30. boost::bind(&tcp_connection::handle_write,
  31. shared_from_this(),
  32. boost::asio::placeholders::error,
  33. boost::asio::placeholders::bytes_transferred));
  34. }
  35. private:
  36. tcp_connection(IoService& io_service)
  37. : socket_(io_service)
  38. {
  39. }
  40. void handle_write(const boost::system::error_code& /*error*/,
  41. size_t /*bytes_transferred*/)
  42. {
  43. PRINT_DEBUG("write data!!!");
  44. }
  45. TCP::socket socket_;
  46. std::string message_;
  47. };
  48. class tcp_server
  49. {
  50. public:
  51. tcp_server(IoService& io_service)
  52. : acceptor_(io_service, TCP::endpoint(TCP::v4(), 10000))
  53. {
  54. start_accept();
  55. }
  56. private:
  57. void start_accept()
  58. {
  59. tcp_connection::pointer new_connection =
  60. tcp_connection::create(acceptor_.get_io_service());
  61. acceptor_.async_accept(
  62. new_connection->socket(),
  63. boost::bind(&tcp_server::handle_accept,
  64. this,
  65. new_connection,
  66. boost::asio::placeholders::error));
  67. }
  68. void handle_accept(tcp_connection::pointer new_connection,
  69. const boost::system::error_code& error)
  70. {
  71. if (!error)
  72. {
  73. new_connection->start();
  74. start_accept();
  75. }
  76. }
  77. TCP::acceptor acceptor_;
  78. };
  79. }
  80. // tcp_connection与tcp_server封装后
  81. void test_asio_asynserver()
  82. {
  83. try
  84. {
  85. IoService io_service;
  86. tcp_server server(io_service);
  87. // 只有io_service类的run()方法运行之后回调对象才会被调用
  88. io_service.run();
  89. }
  90. catch (std::exception& e)
  91. {
  92. std::cerr << e.what() << std::endl;
  93. }
  94. }
 
http://blog.csdn.net/huang_xw/article/details/8518740

boost库asio详解8——几个TCP的简单例子的更多相关文章

  1. boost库asio详解1——strand与io_service区别

    namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::a ...

  2. 【Boost】boost库asio详解5——resolver与endpoint使用说明

    tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...

  3. 【Boost】boost库asio详解3——io_service作为work pool

    无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE.使用io_service作为处理工作的work pool,可以 ...

  4. 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题

    io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. void test_asio_nowork() { boost::asi ...

  5. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  6. STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...

  7. 《TCP-IP详解卷3:TCP 事务协议、HTTP、NNTP和UNIX域协议》【PDF】下载

    TCP-IP详解卷3:TCP 事务协议.HTTP.NNTP和UNIX域协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 ...

  8. Boost::bind使用详解

    1.Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局 ...

  9. Boost::split用法详解

    工程中使用boost库:(设定vs2010环境)在Library files加上 D:\boost\boost_1_46_0\bin\vc10\lib在Include files加上 D:\boost ...

随机推荐

  1. spring 输出mvc

    http://flysnowxf.iteye.com/blog/1187580 http://viralpatel.net/blogs/spring-requestheader-example/ 基于 ...

  2. oracle 复制表数据,复制表结构

    1.不同用户之间的表数据复制 对于在一个数据库上的两个用户A和B,假如需要把A下表old的数据复制到B下的new,请使用权限足够的用户登入sqlplus:insert into B.new(selec ...

  3. [RxJS] Use groupBy in real RxJS applications

    This lesson will show when to apply groupBy in the real world. This RxJS operator is best suited whe ...

  4. thinkphp5多级控制器是什么?怎么使用?

    thinkphp5多级控制器是什么?怎么使用? 一.总结 1.多级控制器是让控制器的级数变成多级,也就是controller目录下可以新建其它目录. 2.使用的话注意目录下的控制的的命名空间(加上目录 ...

  5. 360随身WIFI作USB无线网卡的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1. 到控制面板上把360wifi卸载. 2. 到雷凌的官网下载网卡驱动,注意选择USB(RT2870***),操作系 ...

  6. 机器学习 Softmax classifier (无隐含层)

    程序实现 Softmax classifer, 没有隐含层, f=wx+b y=efi∑jefj %% Softmax classifier function Out=Softmax_Classifi ...

  7. 物理引擎UIDynamic

    nUIDynamic   n什么是UIDynamic pUIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 p可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ü重力. ...

  8. Web开发的编码解决中文乱码

    中文乱码有两个环节会出现 第一,从请求体中获得的数据 从请求体中获得的数据要为其进行编码,默认为ISO-8859-1,所以在使用getParameter()时先调用setCharacterEncodi ...

  9. 【b303】加分二叉树

    [题目链接]:https://vijos.org/p/1100 [题意] [题解] 因为已经确定了最后中序遍历的结果为1..n; 所以对于每一个区间[l..r] 你需要确定这个区间里面哪一个是这个子树 ...

  10. Lettcode_104_Maximum Depth of Binary Tree

    本文研究的总结,欢迎转载,但请注明出处:http://blog.csdn.net/pistolove/article/details/41964475 Maximum Depth of Binary ...