• boost asio 网络编程案例简单改写


    boost教程:http://zh.highscore.de/cpp/boost/
    改写7.4网络编程案例,服务器支持连接多个客户端
    
    服务端:
    #include <iostream>
    #include <string>
    #include <boost/asio.hpp>
    
    /// <summary>
    /// 简单服务器,客户端连接就发送 HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!
    /// </summary>
    
    boost::asio::io_context io;
    boost::asio::ip::tcp::socket sock(io);
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 9076);
    boost::asio::ip::tcp::acceptor acceptor(io, endpoint);
    std::string data = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!";
    
    void accept_handler(const boost::system::error_code& ec)
    {
        if (!ec)
      {
    //如果有新客户端连接,需要将sock转移给新的客户端sock,原来的sock用于继续接收新客户端 boost::asio::ip::tcp::socket client_sock(std::move(sock)); client_sock.async_write_some(boost::asio::buffer(data), [](
    const boost::system::error_code& ec, std::size_t size) {}); } acceptor.async_accept(sock, accept_handler); } int main() { acceptor.listen(); acceptor.async_accept(sock,accept_handler); io.run(); }
    客户端:
    #include <boost/asio.hpp>
    #include <boost/array.hpp>
    #include <iostream>
    #include <string>
    
    boost::asio::io_context io;
    boost::asio::ip::tcp::socket sock(io);
    boost::asio::ip::tcp::resolver resolver(io);
    boost::array<char, 1024> buff;
    
    void read_handler(const boost::system::error_code& ec, std::size_t size)
    {
        //请留意,read_handler() 在将数据写出至 std::cout 之后,会再次调用 async_read_some() 方法。 
        //这是必需的,因为无法保证仅在一次异步操作中就可以接收到整个网页。 async_read_some() 和 read_handler()
        //的交替调用只有当连接被破坏时才中止,如当 web 服务器已经传送完整个网页时。 这种情况下,在 read_handler() 内部将报告一个错误,
        // 以防止进一步将数据输出至标准输出流,以及进一步对该 socket 调用 async_read() 方法。 这时该例程将停止,因为没有更多的异步操作了。
        if (!ec)
        {
            std::cout << std::string(buff.data(), size) << std::endl;
            //客户端接收一次消息接收完就结束进程
            sock.async_read_some(boost::asio::buffer(buff), read_handler);
        }
        //客户端可以继续接收消息,不结束进程
        //sock.async_read_some(boost::asio::buffer(buff), read_handler);
    }
    
    void connect_handler(const boost::system::error_code& ec)
    {
        if (!ec)
        {
            sock.async_read_some(boost::asio::buffer(buff), read_handler);
        }
    }
    
    void resolver_handler(const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator it)
    {
        if (!ec)
        {
            sock.async_connect(*it, connect_handler);
        }
    }
    int main()
    {
        boost::asio::ip::tcp::resolver::query query("127.0.0.1", "9076");
        resolver.async_resolve(query, resolver_handler);
        io.run();
    }
  • 相关阅读:
    同行——冲刺集合!!!
    团队作业第六次——事后诸葛亮
    同行——冲刺总结
    同行——冲刺day7(11.14)
    同行——测试随笔
    同行——冲刺day6(11.13)
    同行——冲刺day5(11.12)
    同行——冲刺day4(11.11)
    同行——冲刺day3(11.10)
    同行——冲刺day2(11.9)
  • 原文地址:https://www.cnblogs.com/darkif/p/15693745.html
Copyright © 2020-2023  润新知