boot asio 非阻塞同步编程---非阻塞的accept和receive
boot asio 非阻塞同步编程---非阻塞的accept和receive。
2014年4月11日15:45:19
客户端编程:
- #include<boost/timer.hpp>
- #include <iostream>
- #include <boost/asio.hpp>
- #include <stdlib.h>
- using namespace boost::asio;
- using namespace std;
- #define RECEIVE_BUF_SIZE 100
- #define RECEIVE_BYTE_NUM 30
- int readMaxBytesInTime(ip::tcp::socket & socket,char * strBuf,int nMaxBytes,int nMilSec)
- {
- boost::timer t;
- int nTotalRec = 0;
- int nLeftBytes = nMaxBytes - nTotalRec;
- while(1)
- {
- boost::system::error_code ec;
- char buf[RECEIVE_BUF_SIZE];
- int nWantBytes = 0;
- if(nLeftBytes < RECEIVE_BUF_SIZE)
- {
- nWantBytes = nLeftBytes;
- }
- else
- {
- nWantBytes = RECEIVE_BUF_SIZE;
- }
- size_t len=socket.read_some(buffer(buf,nWantBytes), ec);
- if(len>0)
- {
- memcpy(strBuf + nTotalRec,buf,len);
- nTotalRec += len;
- nLeftBytes -= len;
- if(nLeftBytes <= 0)
- break;
- else
- continue;
- }
- else
- {
- if(t.elapsed()*1000 < nMilSec)
- {
- Sleep(0);
- continue;
- }
- else
- break;
- }
- }
- return nTotalRec;
- }
- int main(int argc, char* argv[])
- {
- // 所有asio类都需要io_service对象
- io_service iosev;
- // socket对象
- ip::tcp::socket socket(iosev);
- socket.open(boost::asio::ip::tcp::v4());
- socket.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
- // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
- ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
- // 连接服务器
- boost::system::error_code ec;
- boost::timer t;
- socket.connect(ep,ec);
- cout<< t.elapsed()<<"s"<<endl;
- system("PAUSE");
- // 如果出错,打印出错信息
- if(ec)
- {
- std::cout << boost::system::system_error(ec).what() << std::endl;
- return -1;
- }
- // 接收数据
- char buf[RECEIVE_BYTE_NUM];
- int len = readMaxBytesInTime(socket,buf,RECEIVE_BYTE_NUM,1000);
- std::cout<<"接收字节数:"<<len<<std::endl;
- std::cout.write(buf, len);
- system("PAUSE");
- return 0;
- }
服务器端编程:
- #include <iostream>
- #include <boost/asio.hpp>
- #include <stdlib.h>
- int main(int argc, char* argv[])
- {
- using namespace boost::asio;
- // 所有asio类都需要io_service对象
- io_service iosev;
- ip::tcp::acceptor acceptor(iosev);
- acceptor.open(boost::asio::ip::tcp::v4());
- acceptor.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
- // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
- ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
- acceptor.bind(ep);
- acceptor.listen();
- for(;;)
- {
- boost::system::error_code ec;
- // socket对象
- ip::tcp::socket socket(iosev);
- // 等待直到客户端连接进来
- while (1)
- {
- acceptor.accept(socket,ec);
- if(ec)
- {
- std::cout <<
- boost::system::system_error(ec).what() << std::endl;
- Sleep(10);
- }
- else
- break;
- }
- system("PAUSE");
- // 显示连接进来的客户端
- std::cout << socket.remote_endpoint().address() << std::endl;
- // 向客户端发送hello world!
- char * str = "hello world!hello world!";
- socket.write_some(buffer(str,20), ec);
- // 如果出错,打印出错信息
- if(ec)
- {
- std::cout <<
- boost::system::system_error(ec).what() << std::endl;
- break;
- }
- // 与当前客户交互完成后循环继续等待下一客户连接
- }
- return 0;
- }
boot asio 非阻塞同步编程---非阻塞的accept和receive相关推荐
- Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...
- 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...
- 网络编程 多道技术与同步/异步和阻塞/非阻塞
UDP协议服务端模板代码 import socketserver = socket.socket(type=socket.SOCK_DGRAM) # 创建socket对象,括号内选择类型为UDPser ...
- 并发编程:并发和并行、多进程、同步异步,阻塞非阻塞、进程同步(进程锁)、线程、GIL全局解释器锁、锁-信号量-Event事件、协程
文章目录 一. 操作系统的发展史 二. 进程基础 三. 并发和并行 四. 如何开启多进程 五. 进程调度算法(了解) 六. 同步异步,阻塞非阻塞(了解) 1. 状态介绍 2.同步和异步.阻塞和非阻塞 ...
- Spring WebFlux异步非阻塞式编程
一.什么是 Spring WebFlux Spring MVC 构建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型,什么是同步阻塞式 I/O 模型呢?就是说,每一个请求对应一个线程 ...
- 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...
- NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞
在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...
- 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...
- 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分
概念解释: 同步/异步, 它们是消息的通知机制 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行, ...
最新文章
- bzoj1251: 序列终结者 (splay)
- python程序员发展-2018年,程序员对Python有着这些期待!
- 【Windows 逆向】OD 调试器工具 ( 推荐汉化版的 OD 调试工具 | 吾爱破解专用版Ollydbg | 备选工具 )
- this指针的用法详解
- “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
- 双曲线和直线联立公式_圆锥曲线联解公式
- Http协议(4)—HTTP认证机制
- C# WinForm开发系列 - Thread/Delegate/Event
- 2022年大厂中秋礼盒大赏,卷的就是创意!
- vm12 和 centos 下载地址
- 投资理财-基金基本术语概念整理
- 刚刚,蚂蚁区块链喜提“世界互联网领先科技成果”大奖!
- feologit:固定效应有序Logit模型
- 【绘图】3D点图 及绘图关系matplotlib中plt系列
- Kafka(八)----Kafka Tool 2.0.7(最新)版本超详细使用指北
- 不同应用选择荧光染料 -CY7 ALK脂溶性Sulfo-Cyanine7 alkyne 结构式应用
- 通过加速计和地磁传感器实现方位角
- MybatisPlus报错can not find lambda cache for this entity
- 常见的地理坐标系与投影坐标系
- 如何在Python中使用Tushare进行股票日线行情获取并存储至数据库