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

客户端编程:

  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. }

服务器端编程:

  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. 简单测试Java线程安全中阻塞同步与非阻塞同步性能

    摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...

  2. Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.

    1.阻塞. 同步. 1) 读取的文件: input.txt 菜鸟教程官网地址:www.runoob.com 2) main.js var fs = require("fs"); / ...

  3. Python并发编程之同步\异步and阻塞\非阻塞

    一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也 ...

  4. Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程

    Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...

  5. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞

    一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...

  6. python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  7. 同步与异步 & 阻塞与非阻塞

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...

  8. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  9. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

随机推荐

  1. string 类(二)

    处理string对象中的字符: 在cctype头文件中定义了一组标准库函数来处理string对象中的字符,比如检查一个string对象是否包含空白,或者把string对象中的字母改成小写,再或者查看某 ...

  2. c#.NET中日志信息写入Windows日志中解决方案

    1. 目的应用系统的开发和维护离不开日志系统,选择一个功能强大的日志系统解决方案是应用系统开发过程中很重要的一部分.在.net环境下的日志系统解决方案有许多种,log4net是其中的佼佼者.在Wind ...

  3. sqoop学习3(数据导入乱码问题)

    sqoop将mysql数据库中数据导入hdfs或hive中后中文乱码问题解决办法 [root@spark1 ~]# vi /etc/my.cnf 修改配置文件 在文件内的[mysqld]和client ...

  4. Spring获取bean的一种方式

    随便一百度,网上一大把,并且还不止一种.所以这里就只记录目前用的一种好了. 实现ApplicationContextAware接口 即可: import org.springframework.bea ...

  5. Linux 解压压缩命令

    一.概述: 1.压缩命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:t ...

  6. eclipse build path 以及 clean(转)

    1.设置"source folder"与"output folder". source folder:存放.Java源文件的根目录:output folder: ...

  7. tp5定时器

    # 定时器 * * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 1 ...

  8. MongoDB3.0 创建用户

    use mydb db.createUser( { "user" : "sa", "pwd": "sa", " ...

  9. Python学习之路day4-函数高级特性、装饰器

    一.预备知识 学习装饰器需理解以下预备知识: 函数即变量 函数本质上也是一种变量,函数名即变量名,函数体就变量对应的值:函数体可以作为值赋给其他变量(函数),也可以通过函数名来直接调用函数.调用符号即 ...

  10. BW ON HANA 业务模型关系与数据取数

    在接到业务需求之后,我认为重要的是理清楚自己该做什么.来实现业务.由于不了解业务,还是走了很多弯路.本可以不用这么做,还是这么做了.自然你最傻瓜的按照用户的方式去实现是没有问题的. 会使后面的人难以维 ...