asio的http服务

asio的http服务

原创文章禁止转载
asio的http服务

代码

#include <string>
#include <memory>
#include <iostream>
#include "boost/asio.hpp"

class HttpConnect : public std::enable_shared_from_this<HttpConnect>
{
public:
    HttpConnect(boost::asio::io_context& io) : m_socket(io) {}
    ~HttpConnect(){}
    void RunOnce()
    {
        auto sphc = shared_from_this();
        boost::asio::async_read_until(m_socket, boost::asio::dynamic_buffer(m_szRequest), "\r\n\r\n",
            [sphc, this](const boost::system::error_code& err, size_t length) {
                if (err)
                {
                    std::cout << "async_read_until error:" << err.message() << '\n';
                    return;
                }
                std::cout << "Request length: " << length << '\n';
                std::cout << m_szRequest << '\n';

                const char cszHtml[]{ "HTTP/1.0 200 OK\r\n\r\n<html>hello word!!!</html>\r\n" };
                boost::asio::async_write(m_socket, boost::asio::buffer(cszHtml), [sphc, this](const boost::system::error_code& err, size_t length){
                    std::cout << "write length: " << length << '\n';
                    if (err)
                    {
                        std::cout << "async_write error:" << err.message() << '\n';
                    }
                    m_socket.close();
                    }
                ); // async_write
            }
        );// async_read_until
    }
    boost::asio::ip::tcp::socket& Socket() { return m_socket; }
private:
    boost::asio::ip::tcp::socket m_socket;
    std::string m_szRequest;
};

class SimpleHttpServer
{
public:
    SimpleHttpServer(boost::asio::io_context& io, boost::asio::ip::tcp::endpoint ep) : m_ioContext(io), m_acceptor(io, ep) {}
    ~SimpleHttpServer(){}
    void StartAccept()
    {
        auto sphc = std::make_shared<HttpConnect>(m_ioContext);
        m_acceptor.async_accept(sphc->Socket(), [sphc, this](const boost::system::error_code& err) {
            if (err)
            {
                std::cout << "async_accept error:" << err.message() << '\n';
                return;
            }
            sphc->RunOnce();
            StartAccept();
            }
        );// async_accept
    }
private:
    boost::asio::io_context& m_ioContext;
    boost::asio::ip::tcp::acceptor m_acceptor;
};
// 
int main()
{
    unsigned short nPort{ 8866 };
    boost::asio::ip::address address(boost::asio::ip::make_address("127.0.0.1"));

    boost::asio::io_context io;
    boost::asio::ip::tcp::endpoint ep(address, nPort);
    SimpleHttpServer httpServer(io, ep);
    httpServer.StartAccept();
    io.run();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boost.Asio是一种功能强大的C++网络编程库,其中包含了HTTP Server框架。学习Boost.AsioHTTP Server模块可以帮助我们了解如何使用C++编写一个高效且稳定的HTTP服务器。 开始学习Boost.AsioHTTP Server模块之前,我们首先需要了解HTTP协议的基本知识。HTTP协议是一种用于客户端和服务器之间进行通信的协议,我们在这个基础上构建HTTP服务器。然后,我们需要了解Boost.Asio库的基本概念和用法,比如异步操作、套接字和流等。 在学习Boost.AsioHTTP Server模块时,我们需要了解以下几个方面: 1. 创建一个TCP服务器:我们需要使用Boost.Asio库提供的TCP套接字来创建一个服务器,监听指定的端口,并能够处理来自客户端的连接请求。 2. 解析HTTP请求:服务器接收到客户端发送的请求后,需要解析HTTP报文,将请求方法、路径和其他相关信息提取出来,以便后续处理。 3. 处理HTTP请求:服务器根据解析出的请求信息,执行相应的处理逻辑,并生成HTTP响应报文,然后通过TCP连接将响应发送给客户端。 4. 异步操作管理:Boost.Asio库的一个重要特性是提供了非阻塞的异步操作。我们需要了解如何使用异步操作来实现高性能的HTTP服务器,如异步读取请求、异步处理请求和异步发送响应等。 5. 错误处理和异常处理:在编写网络程序时,错误处理非常重要。我们需要了解Boost.Asio库提供的错误处理机制,以及如何正确处理和恢复可能发生的异常。 通过学习Boost.AsioHTTP Server模块,我们可以提高我们的网络编程技能,了解HTTP协议的工作原理,以及如何使用C++编写高性能的HTTP服务器。这对于开发Web应用、服务端应用程序等领域都非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值