zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/darkif/p/15693745.html
Copyright © 2011-2022 走看看