zoukankan      html  css  js  c++  java
  • 学习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
  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4347502.html
Copyright © 2011-2022 走看看