摘于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. thinkphp,onethink,thinkox验证码不显示

    使用验证码的时候,一开始正常,后来不显示了 网上说是utf-8的编码问题,什么bom去掉,转化为无bom的格式 我都试了,没用 后来知道是在调用验证码的地方  写上 Public function v ...

  2. POST提交数据时四种常见的数据格式

    最近项目部署到新环境tomcat+mysql,想看看项目部署成功没有,就用soupui调对应接口开测试,soupui使用比较简单,给上接口地址,入参xml报文,把入参的media Type设置为app ...

  3. [Java开发之路](15)注解

    1. 简单介绍 注解(也被称为元数据),为我们在代码中加入信息提供了一种形式化的方法. 注解在一定程度上是把元数据与源码文件结合在一起,而不是保存在外部文档中这一大趋势之下所催生的. 它能够提供用来完 ...

  4. 【Bash百宝箱】Linux shell学习

    shell特点-- Linux有多种shell能够使用,默认的为bash,bash有以下几个主要特点. 1.命令记忆能力 在命令行中按上下键能够找到一个前/后输入的命令.这些命令记录在-/.bash_ ...

  5. GCD网络多线程---同步运行,异步运行,串行队列,并行队列

    总结:同步(无论是串行还是并行)----不又一次开辟子线程 异步(无论是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global ...

  6. Wow6432Node(32位程序的注册表内容都在这个节点下,也可直接使用%systemroot%\syswow64\regedit进行编辑)

    64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...

  7. html5-8 如何控制html5中的视频标签和音频标签

    html5-8 如何控制html5中的视频标签和音频标签 一.总结 一句话总结:找到视频或者音频的element对象,然后查手册看对应的方法或者属性就可以,里面有控制的. 1.如何控制html5中的视 ...

  8. Thinking in UML 学习笔记(二)——UML核心视图之用例图

    在UML中,需求模型又称为用例模型,它主要用于描述系统的功能性需求,即软件可以实现的功能,如登录.注册.入库.出库.查看库存报表.增加员工信息等.常规的用例建模一般包括两个组成部分:绘制用例图和编写用 ...

  9. tcp注意点

    tcp注意点 tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器 tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip.port等信息就好,本地客户端可以随机 tcp服务 ...

  10. 【t097】寄存器

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 蠕虫是一个古老的电脑游戏,它有许多版本.但所有版本都有一个共同的规则:操纵一 条蠕虫在屏幕上转圈,并试 ...