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和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
随机推荐
- 在各种Linux发行版上安装Git的教程
Git是一个流行的开源版本控制系统(VCS),最初是为Linux环境开发的.跟CVS或者SVN这些版本控制系统不同的是,Git的版本控制被认为是“分布式的”,某种意义上,git的本地工作目录可以作为一 ...
- linux下常用FTP命令 1. 连接ftp服务器[转]
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- request.getPathInfo();
request.getPathInfo(); 这个方法返回请求的实际URL相对于请求的serlvet的url的路径.(个人理解.)比如,有一个Servlet的映射是这样配置的: <servlet ...
- JavaWeb -- 邮件收发
smtp协议: telnet smtp.qq.com 25 ehlo kevin auth login eGlhbmdqaWU1NUBxcS5jb20= a2V2aW5feGlhbmc1NQ== ma ...
- ZigzagConvert
public class ZigzagConvert { public static String convert(String s, int nRows) { int len = s.length( ...
- Merge 2
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- sql处理数据库锁的存储过程
/*--处理死锁 查看当前进程,或死锁进程,并能自动杀掉死进程 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --邹建 2004.4 ...
- wpf 界面平级之间设置上下顺序关系(ZIndex)
只能用于平级之间设置上下顺序 this.grid1.SetValue(Grid.ZIndexProperty, 9999); Panel.SetZIndex(th ...
- Uploading files using ASP.NET Web Api
http://chris.59north.com/post/Uploading-files-using-ASPNET-Web-Api
- tlflearn 编码解码器 ——数据降维用
# -*- coding: utf-8 -*- """ Auto Encoder Example. Using an auto encoder on MNIST hand ...