boot asio 非阻塞同步编程---非阻塞的accept和receive。
boot asio 非阻塞同步编程---非阻塞的accept和receive。
客户端编程:
- #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。的更多相关文章
- 简单测试Java线程安全中阻塞同步与非阻塞同步性能
摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...
- Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.
1.阻塞. 同步. 1) 读取的文件: input.txt 菜鸟教程官网地址:www.runoob.com 2) main.js var fs = require("fs"); / ...
- Python并发编程之同步\异步and阻塞\非阻塞
一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也 ...
- Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程
Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...
- Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...
- python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...
- 同步与异步 & 阻塞与非阻塞
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...
- 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
随机推荐
- 1.2CMM/CMMI是什么?
"CMM是指“能力成熟度模型”,其英文全称为Capability Maturity Model for Software,英文缩写为SW-CMM,简称CMM.它是对于软件组织在定义.实施.度 ...
- Windows10提示“没有权限使用网络资源”的解决方案
1.点击“开始→运行”,在“运行”对话框中输入“GPEDIT.MSC”,打开组策略编辑器 2.依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利分配” 3.双击“拒绝从网络访问这台 ...
- Harbor 镜像管理专家
Harbor是一个企业级的镜像管理仓库,是VMware主导的一个开源项目(github地址:https://github.com/vmware/harbor). Harbor提供了以下功能特性: Cl ...
- eclipse添加删除插件-eclipse marketplace
源文地址:http://jingyan.baidu.com/article/cdddd41c5c883353cb00e19e.html 在有些版本的eclips上并没有eclipse marketpl ...
- 什么是CDN 域名预热
通常大家理解的预热功能是,缓存预热.将需要预热的资源推送到CDN边缘节点,用户访问时将不需要再回源站,可以直接命中缓存.这样可以加快资源的首次访问,同时缓解突增回源流量给源站造成的压力.这里说的是域名 ...
- div css 练习1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- zhly
5. 百叶002 名字2008 1.新浪 阿里矢量图库账号 15031116087 名字2008 2.acdsee 账号 1173209945 同密码一样 3.zhly 我的名字2016 ...
- CSS之动态相册
注释还是比较详细的,所以我就不一一再说明了.--->运行效果图<--- (点击之前温馨提示一下:此picture是我自己的照片,本来不想拿出来的,后来觉得反正不会有很多人看到而且也没人认识 ...
- Microsoft SQL Server for Linux安装和配置
虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...
- 双十字路口交通仿真程序(VS2010+MFC)
这个程序是我上研二上学期时下一届师弟师妹们的面向对象课程大作业,当时我正好看过两三本 C++ 书籍,虽然忙着项目,但还是忙里偷闲检验了下自己.从设计到实现,耗时一周左右,完成于 2013 年年底. 虽 ...