学习boost::asio一些小例子

# 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_service; 

void run() 
{ 
    io_service.run(); 
} 

/*
两个线程调用run运行同一个服务,当第一服务在阻塞时,可以再第二个线程里面执行
但这样会使得使用std::cout混乱,开线程要注意,开过多的线程是没有意义的
*/

int main() 
{ 
    boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); 
    timer1.async_wait(handler1); 
    boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(5)); 
    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(5)); 
    timer1.async_wait(handler1); 
    boost::asio::deadline_timer timer2(io_service2, boost::posix_time::seconds(5)); 
    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, 4096> 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
Host: highscore.de

"));
        //启动数据的接收,接收数据保存在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");//新建一个查询,域名为...,端口为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(), 80);
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
Content-Length: 13

Hello, 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
原文地址:https://www.cnblogs.com/zzyoucan/p/4347502.html