基于C++的简单HTTP服务器实现

这篇具有很好参考价值的文章主要介绍了基于C++的简单HTTP服务器实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于C++的简单HTTP服务器实现
一个Web Server就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error信息。

总体概述
使用线程池 + epoll(ET和LT均实现) + 模拟Proactor模式的并发模型;
使用状态机解析HTTP请求报文,支持解析GET和POST请求;
改进成小根堆实现的定时器,关闭超时的非活动连接;
利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能;
实现同步/异步日志系统,记录服务器运行状态;
改进了http_conn::write()函数,可以传输大文件;
经Webbench压力测试可以实现上万的并发连接数据交换。
基于C++的简单HTTP服务器实现

具体实现

服务器测试环境

  • Ubuntu版本16.04
  • MySQL版本5.7.29
  • 火狐浏览器测试环境

测试前确认已安装MySQL数据库

// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user(
    username char(50) NULL,
    passwd char(50) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');

修改main.c中的数据库初始化信息

// root root修改为服务器数据库的登录名和密码
// yourdb修改为上述创建的yourdb库名
// 3306是默认端口号
connPool->init("localhost", "root", "root", "yourdb", 3306, 8);

修改http_conn.cpp中的root路径

// 修改为root文件夹所在路径
const char *doc_root = "/home/ubuntu16/WEb/1/root";

在终端打开,生成server,启动编译

make server

启动server,port为端口号,可以指定一个如9006,12345

./server port

打开火狐浏览器

http://localhost:9006/  或者 127.0.0.1:9006

代码运行

基于C++的简单HTTP服务器实现

基于C++的简单HTTP服务器实现

项目并发测试 

测试方法

  • 测试环境: Ubuntu:16.04 cpu:i7-9700 内存:16G。在四种并发模式下系统运行状态
    ./test_presure/webbench-1.5/webbench -c 100 -t 10 http://ip:port/
    ./test_presure/webbench-1.5/webbench -c 1000 -t 10 http://ip:port/
    ./test_presure/webbench-1.5/webbench -c 5000 -t 10 http://ip:port/
    ./test_presure/webbench-1.5/webbench -c 10000 -t 10 http://ip:port/
    

    I/O复用方式,listenfd和connfd可以使用不同的触发模式,代码中使用LT + LT模式,可以自由修改与搭配.

  • listenfd触发模式,关闭main.c中listenfdET,打开listenfdLT
     //#define listenfdET       //边缘触发非阻塞
     #define listenfdLT         //水平触发阻塞
    
  • listenfd触发模式,关闭http_conn.cpp中listenfdET,打开listenfdLT
     //#define listenfdET       //边缘触发非阻塞
     #define listenfdLT         //水平触发阻塞
    

    connfd触发模式,关闭http_conn.cpp中connfdET,打开connfdLT

     //#define connfdET       //边缘触发非阻塞
     #define connfdLT         //水平触发阻塞
    

    测试结果

  1. LT + LT模式基于C++的简单HTTP服务器实现
  2. LT + ET模式

    同理使用LT+ET的模式基于C++的简单HTTP服务器实现

  3. ET+ET模式基于C++的简单HTTP服务器实现

    日志写入方式,代码中使用同步日志,可以修改为异步写入.

同步写入日志

关闭main.c中ASYNLOG,打开同步写入SYNLOG

//#define SYNLOG //同步写日志
 #define ASYNLOG   /异步写日志

选择I/O复用方式或日志写入方式后,按照前述生成server,启动server,即可进行测试.

参考文章

https://github.com/qinguoyi/TinyWebServer/tree/raw_version
https://github.com/qinguoyi/TinyWebServer
Linux高性能服务器编程,游双著.文章来源地址https://www.toymoban.com/news/detail-434502.html

到了这里,关于基于C++的简单HTTP服务器实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP 代理服务器的设计与实现(C++)

    设计并实现一个基本 HTTP 代理服务器。要求在指定端口(例如 8080)接收来自客户的 HTTP 请求并且根据其中的 URL 地址访问该地址 所指向的 HTTP 服务器(原服务器),接收 HTTP 服 务器的响应报文,并 将响应报文转发给对应的客户进行浏览。 设计并实现一个支持 Cache 功能的

    2024年02月03日
    浏览(28)
  • HTTP 服务器(基于go实现)

    编写一个 HTTP 服务器,接收客户端 request,并将 request 中带的 header 写入 response header 编写一个 HTTP 服务器, 接收客户端 request,并将 request 中带的 header 写入 response header ,读取当前系统的环境变量中的 VERSION 配置,并写入 response header Server 端记录访问日志包括客户端 IP,HT

    2024年02月11日
    浏览(42)
  • Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议

    代码地址:WebServer_GitHub_Addr 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器。该服务器支持通过http协议发送报文,跨主机抓取服务器上特定资源。与此同时,该Web服务器后台通过C++语言,通过原生系统线程调用 pthread.h ,实现了一个 基于阻塞队列

    2024年02月07日
    浏览(52)
  • 基于Netty实现一个HTTP服务器

    一、序言 Netty因其易编程,高可靠性,高性能的网络IO,在分布式开发中被广泛用于网络通信,比如RocketMQ,Dubbo底层都能看到Netty的身影,高性能的本质是其Reactor线程模型以及异步的编程处理。Reactor有三种模型,常用的有主从 Reactor多线程模式,具体表现如下: 在日常开发中

    2023年04月25日
    浏览(38)
  • 基于BaseHTTPRequestHandler的HTTP服务器基础实现

    BaseHTTPRequestHandler 是Python中的一个基类,属于 http.server 模块,用于处理HTTP请求的基本功能。它提供了处理常见HTTP请求方法(如GET、POST等)的默认实现,并允许你在子类中进行定制化扩展。下面详细介绍 BaseHTTPRequestHandler 的主要特点和使用方法: 主要特点: 处理HTTP请求:

    2024年02月08日
    浏览(36)
  • 【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问

    目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundat

    2024年02月10日
    浏览(36)
  • 用Java包com.sun.net.httpserver下面的类实现一个简单的http服务器demo

    java的com.sun.net.httpserver包下的类提供了一个高层级的http服务器API,可以用来构建内嵌的http服务器。支持http和https。这些API提供了一个RFC 2616 (HTTP 1.1)和RFC 2818 (HTTP over TLS)的部分实现。 https://docs.oracle.com/en/java/javase/19/docs/api/jdk.httpserver/com/sun/net/httpserver/package-summary.html 下面来实

    2024年02月07日
    浏览(34)
  • 基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    HTTP协议由于其无状态的特性以及超高的普及率,是当下大部分网站选择使用的应用层协议。然而,HTTP/1.x的底层传输方式的几个特性,已经对应用的整体性能产生了负面影响。特别是,HTTP/1.0在每次的TCP连接上只允许发送一次请求,在HTTP/1.1中增加了请求管线,但是这仅仅解决

    2023年04月09日
    浏览(50)
  • 【实战项目】c++实现基于reactor的高并发服务器

    基于Reactor的高并发服务器,分为反应堆模型,多线程,I/O模型,服务器,Http请求和响应五部分 ​全局 Channel 描述了文件描述符以及读写事件,以及对应的读写销毁回调函数,对应存储arg读写回调对应的参数 ​Channel 异或 |:相同为0,异为1 按位与:只有11为1,其它组合全部

    2024年02月12日
    浏览(38)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包