boot asio 非阻塞同步编程---非阻塞的accept和receive。

2014年4月11日15:45:19

客户端编程:

[cpp] view plain copy
  1. #include<boost/timer.hpp>
  2. #include <iostream>
  3. #include <boost/asio.hpp>
  4. #include <stdlib.h>
  5. using namespace boost::asio;
  6. using namespace std;
  7. #define RECEIVE_BUF_SIZE 100
  8. #define RECEIVE_BYTE_NUM 30
  9. int readMaxBytesInTime(ip::tcp::socket & socket,char * strBuf,int nMaxBytes,int nMilSec)
  10. {
  11. boost::timer t;
  12. int nTotalRec = 0;
  13. int nLeftBytes = nMaxBytes - nTotalRec;
  14. while(1)
  15. {
  16. boost::system::error_code ec;
  17. char buf[RECEIVE_BUF_SIZE];
  18. int nWantBytes = 0;
  19. if(nLeftBytes < RECEIVE_BUF_SIZE)
  20. {
  21. nWantBytes = nLeftBytes;
  22. }
  23. else
  24. {
  25. nWantBytes = RECEIVE_BUF_SIZE;
  26. }
  27. size_t len=socket.read_some(buffer(buf,nWantBytes), ec);
  28. if(len>0)
  29. {
  30. memcpy(strBuf + nTotalRec,buf,len);
  31. nTotalRec += len;
  32. nLeftBytes -= len;
  33. if(nLeftBytes <= 0)
  34. break;
  35. else
  36. continue;
  37. }
  38. else
  39. {
  40. if(t.elapsed()*1000 < nMilSec)
  41. {
  42. Sleep(0);
  43. continue;
  44. }
  45. else
  46. break;
  47. }
  48. }
  49. return nTotalRec;
  50. }
  51. int main(int argc, char* argv[])
  52. {
  53. // 所有asio类都需要io_service对象
  54. io_service iosev;
  55. // socket对象
  56. ip::tcp::socket socket(iosev);
  57. socket.open(boost::asio::ip::tcp::v4());
  58. socket.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
  59. // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
  60. ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
  61. // 连接服务器
  62. boost::system::error_code ec;
  63. boost::timer t;
  64. socket.connect(ep,ec);
  65. cout<< t.elapsed()<<"s"<<endl;
  66. system("PAUSE");
  67. // 如果出错,打印出错信息
  68. if(ec)
  69. {
  70. std::cout << boost::system::system_error(ec).what() << std::endl;
  71. return -1;
  72. }
  73. // 接收数据
  74. char buf[RECEIVE_BYTE_NUM];
  75. int len = readMaxBytesInTime(socket,buf,RECEIVE_BYTE_NUM,1000);
  76. std::cout<<"接收字节数:"<<len<<std::endl;
  77. std::cout.write(buf, len);
  78. system("PAUSE");
  79. return 0;
  80. }

服务器端编程:

[cpp] view plain copy
  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <stdlib.h>
  4. int main(int argc, char* argv[])
  5. {
  6. using namespace boost::asio;
  7. // 所有asio类都需要io_service对象
  8. io_service iosev;
  9. ip::tcp::acceptor acceptor(iosev);
  10. acceptor.open(boost::asio::ip::tcp::v4());
  11. acceptor.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
  12. // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
  13. ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
  14. acceptor.bind(ep);
  15. acceptor.listen();
  16. for(;;)
  17. {
  18. boost::system::error_code ec;
  19. // socket对象
  20. ip::tcp::socket socket(iosev);
  21. // 等待直到客户端连接进来
  22. while (1)
  23. {
  24. acceptor.accept(socket,ec);
  25. if(ec)
  26. {
  27. std::cout <<
  28. boost::system::system_error(ec).what() << std::endl;
  29. Sleep(10);
  30. }
  31. else
  32. break;
  33. }
  34. system("PAUSE");
  35. // 显示连接进来的客户端
  36. std::cout << socket.remote_endpoint().address() << std::endl;
  37. // 向客户端发送hello world!
  38. char * str = "hello world!hello world!";
  39. socket.write_some(buffer(str,20), ec);
  40. // 如果出错,打印出错信息
  41. if(ec)
  42. {
  43. std::cout <<
  44. boost::system::system_error(ec).what() << std::endl;
  45. break;
  46. }
  47. // 与当前客户交互完成后循环继续等待下一客户连接
  48. }
  49. return 0;
  50. }

boot asio 非阻塞同步编程---非阻塞的accept和receive相关推荐

  1. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  2. 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO

    IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...

  3. 网络编程 多道技术与同步/异步和阻塞/非阻塞

    UDP协议服务端模板代码 import socketserver = socket.socket(type=socket.SOCK_DGRAM) # 创建socket对象,括号内选择类型为UDPser ...

  4. 并发编程:并发和并行、多进程、同步异步,阻塞非阻塞、进程同步(进程锁)、线程、GIL全局解释器锁、锁-信号量-Event事件、协程

    文章目录 一. 操作系统的发展史 二. 进程基础 三. 并发和并行 四. 如何开启多进程 五. 进程调度算法(了解) 六. 同步异步,阻塞非阻塞(了解) 1. 状态介绍 2.同步和异步.阻塞和非阻塞 ...

  5. Spring WebFlux异步非阻塞式编程

    一.什么是 Spring WebFlux Spring MVC 构建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型,什么是同步阻塞式 I/O 模型呢?就是说,每一个请求对应一个线程 ...

  6. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  7. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...

  8. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...

  9. 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分

    概念解释: 同步/异步, 它们是消息的通知机制 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行, ...

最新文章

  1. bzoj1251: 序列终结者 (splay)
  2. python程序员发展-2018年,程序员对Python有着这些期待!
  3. 【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )
  4. this指针的用法详解
  5. “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
  6. 双曲线和直线联立公式_圆锥曲线联解公式
  7. Http协议(4)—HTTP认证机制
  8. C# WinForm开发系列 - Thread/Delegate/Event
  9. 2022年大厂中秋礼盒大赏,卷的就是创意!
  10. vm12 和 centos 下载地址
  11. 投资理财-基金基本术语概念整理
  12. 刚刚,蚂蚁区块链喜提“世界互联网领先科技成果”大奖!
  13. feologit:固定效应有序Logit模型
  14. 【绘图】3D点图 及绘图关系matplotlib中plt系列
  15. Kafka(八)----Kafka Tool 2.0.7(最新)版本超详细使用指北
  16. 不同应用选择荧光染料 -CY7 ALK脂溶性Sulfo-Cyanine7 alkyne 结构式应用
  17. 通过加速计和地磁传感器实现方位角
  18. MybatisPlus报错can not find lambda cache for this entity
  19. 常见的地理坐标系与投影坐标系
  20. 如何在Python中使用Tushare进行股票日线行情获取并存储至数据库

热门文章

  1. CorelDRAW 条码原来是这样么容易制作出来的呀领教了吧
  2. Java蓝桥杯——梅森素数
  3. 中国典型的四大骨干网络及其IP地址范围
  4. php生成二维码, 做多级分销,推广,推荐人
  5. PID控制算法(实例通俗易懂)
  6. windows下的cd命令
  7. 物理化学发展的瓶颈与思路论坛——论文目录
  8. Ctrl+c失效问题原因、解决方法及相关拓展
  9. matlab如何对三维图进行裁剪,一种三维图像的裁剪方法
  10. 基于C++实现广州地铁线路查询【100010817】