学习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机制与特殊方法重载(类比于 ...
随机推荐
- non-compatible bean definition of same name and class
在整合struts2.1.6+spring2.5.6开发中,使用了注解和struts-convention来实现零配置管理.spring也使用注解annotation方式.现在的问题是:我在连个个不同 ...
- 让C#可以像Javascript一样操作Json DynamicJson
http://blog.csdn.net/lisenyang/article/details/52535314
- mybatis 自动更新表结构 ,兼容通用tkmapper
1.maven引入jar <dependency> <groupId>com.github.gonglb.tools</groupId> <artifactI ...
- js 自定义事件 包含 添加、激活、销毁
1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...
- shll 基础讲解
http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html Shell编程基础 $# 命令行得到的参数个数 $@ 命令行得到的所有参数作 ...
- ViewStub 的使用
一.内容概述 举例说明ViewStub标签的使用 二.ViewStub类的文档说明及应用场举例 文档描述: A ViewStub is an invisible, zero-sized View th ...
- Windows内存管理的方式
一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...
- webpack 环境搭建基础框架
一.安装babel相关 1,安装依赖 cnpm i -D babel-core babel-loader babel-preset-env babel-preset-stage- babel-plug ...
- 383. Ransom Note【easy】
383. Ransom Note[easy] Given an arbitrary ransom note string and another string containing letters f ...
- elasticJob分片跑批
业务迅速发展带来了跑批数据量的急剧增加.单机处理跑批数据已不能满足需要,另考虑到企业处理数据的扩展能力,多机跑批势在必行.多机跑批是指将跑批任务分发到多台服务器上执行,多机跑批的前提是”数据分片”.e ...