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和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
随机推荐
- INSPIRED启示录 读书笔记 - 第21章 产品验证
证明产品的价值.可用性.可行性 产品验证是指在正式开发.部署产品前,验证产品说明文档描述的产品是否符合预期要求 产品经理向产品团队提供最终的产品说明文档前,需要进行三项重要验证 1.可行性测试:明确在 ...
- pache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口
Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC ...
- 标准库string与C风格字符串
返回字符串的长度 string标准库 #include<iostream> #include<cstring> using namespace std; int main() ...
- javax.mail.MessagingException: Could not connect to SMTP host: smtp.xdf.cn
1.问题描述:关于使用Java Mail进行邮件发送,抛出Could not connect to SMTP host: xx@xxx.com, port: 25的异常可能: 当我们使用Java Ma ...
- 【P2014】选课(树状DP)
蒟蒻的第二道树形DP,话说看了这个题的正常做法之后一脸蒙,森林转二叉树??什么诡异的操作,蒟蒻完全没明白那个原理是啥...可能是当初没好好学吧..不管了,索性直接DP. 不难看出,这个题的DP方程和刚 ...
- HttpComponents之httpclient
HttpComponents源码目录:http://www.boyunjian.com/javasrc/org.apache.httpcomponents/httpclient/4.3.4/_/ pa ...
- Java基础(7)-集合类3
list集合的特点 1)有序(存储和取出的元素一直) 2)可重复 List子类的特点 ArrayList 有序,可重复 底层数据结构是数组 查询快,增删慢 线程不安全,效率高 Vector 有序,可重 ...
- 域名注册中EAP期间是什么意思
所谓域名申请期间的EAP指的是,域名优先注册期,行业上也称为“早期接入期”,这个期间的时间是由该域名所在的管理注册局定,而这个EPA期的时间长度也不一样,有的是一个星期,也有的长达两个星期. 域名EA ...
- nova notification
1 compute.instance.update类型的消息 需要配置notify_on_state_change参数,可以为空,或者vm_state,或者vm_and_task_state, 当虚拟 ...
- js dom操作选择器,dom操作复习
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...