• 学习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
  • 相关阅读:
    生成html报告并整合自动发动邮件功能
    python--selenium多线程执行用例实例/执行多个用例
    python--selenium实用的自动生成测试HTML报告方法--HTMLTestRunner
    mysql完整版
    hibernate分页
    解决hibernate向mysql插入中文乱码问题
    c++语言的 代码组织
    命令总结
    c++ 命名空间
    dpkg 、apt
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4347502.html
Copyright © 2020-2023  润新知