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. python 中文字符的处理

    刚开始学习python的时候,都是对这英文的翻译书学习的.没有解除到中文编码的相关问题,直到自己用python去做相关的项目的时候才发先中文编码问题真的非常头疼啊.这里分享一下本人所了解的一些经验. ...

  2. Apache Phoenix数据类型

    数据类型 Java Map 占用大小 (byte) 范围 INTEGER java.lang.Integer 4 -2147483648 to 2147483647 UNSIGNED_INT java ...

  3. whois老域名挖掘技术

    我一般通过站长工具域名WHOIS查询定向收集一些特定域名,拿来分析网站存活站点. 例如: 查询域名基本信息 WHOIS反查得到大部分域名注册信息 一般大一点的厂商都有几百个域名,我们通过此处收集大量顶 ...

  4. MVC 嵌套页面Html.Partial

    return View()相关简介 在asp.net mvc中返回View时使用的是ViewResult,它继承自ViewResultBase 同时它还有个兄弟PartialViewResult.一个 ...

  5. Java中初始变量默认值

    Java语言中有8种基本数据类型,基本情况汇总如下: 序号 数据类型 大小/位 封装类 默认值 可表示数据范围 1 byte(位) 8 Byte 0 -128~127 2 short(短整数) 16 ...

  6. SSIS简介

    SSIS 其全称是Sql Server Integration Services ,是Microsoft BI 解决方案的一大利器. SSIS 的体系结构主要由四部分组成:Integration Se ...

  7. php RabbitMQ使用

    php RabbitMQ使用 参考网址: http://www.rabbitmq.com/tutorials/tutorial-three-php.html 最近研究rabbitmq队列,linux安 ...

  8. WPF各种控件详解——(WPF从我炫系列)

    http://blog.csdn.net/zx13525079024/article/details/5694638

  9. SPOJ - BALNUM 数位dp

    题意:求某一区间内的平衡数个数(指一个数,其中出现过的数,如果是偶数,那么必须出现奇数次,反之偶数次) 题解:用三进制来枚举(0到9)所有情况,0代表没有出现,1代表出现奇数次,2代表出现偶数次dp[ ...

  10. iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多

    iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况.同vmstat一样, ...