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. cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类

    Enemy类没什么内容,就create和init方法,根据参数来创建不同的敌机,头文件代码如下: //飞机的类型 enum planeType {smallPlane, midPlane, bigPl ...

  2. 关于在windows命令提示符cmd下运行Java程序的问题

    1. win+R出现cmd运行窗口,输入Java源码文件名运行时,错误: 找不到或无法加载主类... 问题背景:我已经配置好了Java环境(安装路径PATH,JAVA_HOME已装好,cmd运行jav ...

  3. 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】

    平台信息:linux4.0 平台:qemu 作者:庄泽彬 说明:笨叔叔的Linux视频的笔记 一.编译linux源码 export CROSS_COMPILE=arm-linux-gnueabi- e ...

  4. 【codevs3031】最富有的人(字典树)

    网址:http://codevs.cn/problem/3031/ 这是蒟蒻写的第一道字典树……听说出市选题的神犇要出字符串,于是就赶紧滚去学了学(然而高精度算字符串算法?) 简单来说,字典树就是把一 ...

  5. 考勤助手——基于CS三层结构的子系统设计

    因为小组比较倾向于cs分层结构的风格,所以基于对考勤助手最初的体系架构的设计进行了子系统的分层设计,如下图: 1.教务老师安排课程子系统 2.教务老师查询相关信息的子系统 3.任课教师管理考勤子系统 ...

  6. excel比较筛选两列不一样的数据

    在excel表中,罗列两列数据,用B列数据与A列比较,筛选出B列中哪些数据不同,并用红色标记出来.     首先选中B列.直接鼠标左键点击B列即可选中."开始"--->&qu ...

  7. 中安装rackspace private cloud --6 Deployment rpc

    运行ansible playbook安装之前的准备工作: Perform deployment host initial setup Build containers on target hosts ...

  8. 设计高效sql一般经验谈

      1不用在sql语句使用系统默认的保留关键字 2尽量用exists 和 not exists 代替 in 和 not in 这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ...

  9. ODPS中的TaskContext类里面的write函数

    ODPS中的TaskContext类有几个write函数 write(Record record)用来输出到默认输出表 write(Record record, String label)用来输出的l ...

  10. pythoncook 随记

    第一章 数据结构与算法 1 赋值多个变量 *2 collections deque 构造固定大小队列,插入删除比list快3 查找最大和最小元素的N个元素 heapq nlargest() nsmal ...