学习boost::asio一些小例子
# if
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream> void handler1(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
} void handler2(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
} boost::asio::io_service io_service; void run()
{
io_service.run();
} /*
两个线程调用run运行同一个服务,当第一服务在阻塞时,可以再第二个线程里面执行
但这样会使得使用std::cout混乱,开线程要注意,开过多的线程是没有意义的
*/ int main()
{
boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds());
timer1.async_wait(handler1);
boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds());
timer2.async_wait(handler2);
boost::thread thread1(run);
boost::thread thread2(run);
thread1.join();
thread2.join();
}
#endif #if 0 #include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream> void handler1(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
} void handler2(const boost::system::error_code &ec)
{
std::cout << "5 s." << std::endl;
} boost::asio::io_service io_service1;
boost::asio::io_service io_service2; void run1()
{
io_service1.run();
} void run2()
{
io_service2.run();
} /*
第二种方法不是多个线程运行同一个服务,而是创建多个服务,每个服务用同一个线程,如果线程数与内核数相同,在一个核上面不回出现竞争现象
*/
int main()
{
boost::asio::deadline_timer timer1(io_service1, boost::posix_time::seconds());
timer1.async_wait(handler1);
boost::asio::deadline_timer timer2(io_service2, boost::posix_time::seconds());
timer2.async_wait(handler2);
boost::thread thread1(run1);
boost::thread thread2(run2);
thread1.join();
thread2.join();
} #endif //简单客户端请求
#if 0 #include <boost/asio.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <string> boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::socket sock(io_service);
boost::array<char, > buffer; /**
*@brief 读回调,当读完时read_handler内部产生错误,不回循环调用了
*/
void read_handler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
if (!ec)
{
std::cout << std::string(buffer.data(), bytes_transferred) << std::endl;
//必须的,因为可能包没接完,和read_handler交替运行
sock.async_read_some(boost::asio::buffer(buffer), read_handler);
}
} void connect_handler(const boost::system::error_code& ec)
{
if (!ec)
{
//发送http请求,
boost::asio::write(sock, boost::asio::buffer("GET / HTTP 1.1\r\nHost: highscore.de\r\n\r\n"));
//启动数据的接收,接收数据保存在buffer中,回调read_handler
sock.async_read_some(boost::asio::buffer(buffer), read_handler);
}
} /**
*@brief 域名解析回调
*@param it 解析后地址
*/
void resolver_handler(const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator it)
{
if (!ec)
{
//访问IO对象sock,建立连接
sock.async_connect(*it, connect_handler);
}
} int main()
{
boost::asio::ip::tcp::resolver::query query("www.highscore.de", "");//新建一个查询,域名为...,端口为80
resolver.async_resolve(query, resolver_handler);//解析域名为ip
io_service.run();//将控制权交给操作系统进行异步操作
getchar();
}
#endif //简单的服务器接收例子
#if 0
#include <boost/asio.hpp>
#include <string> boost::asio::io_service io_service;
//接收端口配置,从80端口等待v4类型的ip
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), );
boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);
boost::asio::ip::tcp::socket sock(io_service);
std::string data = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!"; void write_handler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{ } void accept_handler(const boost::system::error_code& ec)
{
if (!ec)
{
//async_write_some函数也能发送数据,但这个函数只要发送一个字节就会回调函数,
//因为将整个数据发送完毕异步操作才算完毕,async_write函数在发送完毕调用write_handler
//这个和libevent机制差不多
boost::asio::async_write(sock, boost::asio::buffer(data), write_handler);
}
} int main()
{
acceptor.listen();//监听,将接收器配置成接收状态
acceptor.async_accept(sock, accept_handler);//等待接收
io_service.run();
} #endif
学习boost::asio一些小例子的更多相关文章
- Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期
学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...
- boost::asio 同步&异步例子
同步客户端: using boost::asio; io_service service; ip::tcp::endpoint ep( ip::address::from_string(); ip:: ...
- 学习Boost/Asio
编译boost 在Mac下使用brew编译boost,为了使用C++11,需要加入参数–c++11 $ brew install boost --c++11 在我的Mac虚拟机里面用了20分钟左右编译 ...
- Java 正则表达式学习总结和一些小例子
从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.r ...
- Python学习一、一个小例子
一.题目: 对于一串氨基酸序列(由字母表前二十个大写字母组成),需要得到每一个氨基酸数目,然后输出到文件夹D:\test\frq.txt,要求用循环和字典实现. 氨基酸序列如下: ABCDEFGHIJ ...
- Python学习中的一些小例子
这篇文章包括用Python编写的斐波那契数列,三位数的水仙花数和百钱买百鸡的基础代码 斐波那契数列: ''' def hanshu(n): n_1 = 1 n_2 = 1 m = n sumn = 0 ...
- 【Pthon入门学习】多级菜单小例子
menu_list = { '北京':{ '昌平':{ '回龙观':{ '和谐家园':{}, '矩阵小区':{}, '北店家园':{} }, '沙河':{ '北街家园1区':{}, '北街家园2区': ...
- 大数据学习——scala的wordCount小例子
val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...
- Python 基础学习的几个小例子
最近在研究动态脚本语言 Python , 出于对其语言精简度的喜欢及大学时期对 matlab 这样的数学领域语言的怀念, 再加上笔者是C++起家,Python中所涉及的del机制与特殊方法重载(类比于 ...
随机推荐
- Redis使用记录
登陆:cd /usr/local/bin 启动客户端:./redis-cli 查看所有key:keys * 查看key类型:type keyname 查看list长度:LLEN KEY_NAME 清空 ...
- ChannelHandlerContext writeAndFlush(firstMessage)
- .Net 下未捕获异常的处理
原地址:http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html .Net 下未捕获异常的处理 作者:Eaglet 随着.Net技术的 ...
- mybatis 自动更新表结构 ,兼容通用tkmapper
1.maven引入jar <dependency> <groupId>com.github.gonglb.tools</groupId> <artifactI ...
- 04-2winPE里面下载系统并安装系统教程
winPE里面下载系统并安装系统教程 首先需要注意的是,你已经使用 装机助理 工具制作好U盘启动盘,通过电脑功能键进入PE界面(不同型号的电脑进入PE界面的功能键不同,根据不同搜索属于她的功能键): ...
- NodeJS 安装cnpm命令行工具错误问题解决
考虑问题从两个方面: 1.网速(网络太慢也是安装失败的一个原因) 2.系统用户权限(需要系统最开始使用的用管理员,新增的管理员安装会有问题) 报错问题记录于此: 实际上问题是:Windows_NT 6 ...
- sql 多线程
1.codeproject上面一个多线程执行sql的库. 开发中常常要执行一些耗时的数据操作,比如update.insert.bulk insert.index creation, 若顺序执行,则操作 ...
- olede读excel
注意点:需要比较excel文件中是否有重复列时,需要设置HDR=No,IMEX=1,即把第一列当做数据读取,不然读到的datatable列名会被自动加数字后缀. /// < summary> ...
- genymotion启动黑屏的原因及临时解决方法
解决办法 好像是要激活网络,具体原因不知道!!! sudo ifconfig vboxnet0 up 下面好像更好使一点 sudo ip link set dev vboxnet0 up
- Linux 常用命令速查
0x001 .在指定文件夹下递归查询包含一个字符串的文件(列出的文件内容片段) grep -r “要查找的串” 文件路径 如 : grep -r "helloworld&q ...