【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素

1.正则表达式

正则表达式它其实是描述了一种字符串匹配的模式,它可以用来在一个字符串中检测一个特定格式的字串,以及可以将符合特定规则的字串进行替换或者提取的功能。

2.正则库的使用

bool std:regex_match (const std:string &src, std:smatch &matches, std:regex &e)

1.src表示要匹配的原始字符串
2.matches,匹配提取的子串会放入这里,类似一个数组
3.e:正则表达式的匹配规则
4.返回值:用于确定匹配是否成功

3.使用正则表达式提取HTTP请求行

#include <iostream>
#include<regex>
#include <string>
int main()
{
    std::string str="GET /qq.com/login?user=tew&paswwd=123 HTTP/1.1\r\n";
    std::smatch matches;
    
    //匹配规则
    std::regex e("(GET|POST|PUT) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    //()表示要提取的子串
    //.是匹配除\n和\r之外的任何单个字符。
    //*表示匹配0次或多次

    //_([^?*])表示以空格开始,匹配并提取非问号的字符,*表示匹配0次或多次
    
    //\\?(.*)_表示以?开始,匹配?后面字符0次或多次,以空格为结尾 
    
    //_(HTTP/1\\.[01]) 表示以空格开始,提取HTTP1. 0或1的字符

    //(?: )? 这个是匹配某个字符串但不提取,最后?表示匹配前面表达式0次或1次

    //中间的?user=tew&paswwd=123不是所有的http请求都有,所以有就提取没有就不提取
    //(?:\\?(.*))? 如果有就执行\\?(.*),如果没有就算
    bool ret=std::regex_match(str,matches,e);
    if(ret==false)return -1;

    for(auto &it:matches)
    {
        std::cout<<it<<std::endl;
    }
    return 0;

}

在这里插入图片描述

仿muduo实现并发服务器可通过以下方法: - **搭建高并发服务器组件**:采用One Thread One Loop式主从Reactor模型,借助该实现的高并发服务器组件,能简洁快速地完成高性能服务器的搭建。利用组件内提供的不同应用层协议支持,还可快速搭建高性能应用服务器,例如项目中提供的HTTP协议组件支持。不过要明确,该项目重点在于实现并发服务器组件,不包含实际业务内容[^1]。 - **开发EventLoop模块**:此模块包含多个部分,成员变量有线程ID、Poller、event_fd、任务队列以及定时器轮等。其具体操作涵盖EventLoop构造、针对eventfd的操作、针对poller的操作、针对threadID的操作、针对TaskQueue的操作、针对定时器的操作等,这些操作共同构成了EventLoop的主要工作内容[^2]。 - **实现定时任务管理**:在项目里,Connection模块调用EventLoop模块的共有接口,把定时任务插入到TimerWheel模块中。定时器模块主要用于管理客户发起的连接,具备非活跃连接销毁功能[^3]。 以下是一个简单示例代码框架来体现部分思路: ```cpp #include <iostream> #include <thread> #include <vector> // 简单模拟Poller class Poller { public: void poll() { std::cout << "Polling..." << std::endl; } }; // 简单模拟TimerWheel class TimerWheel { public: void addTask() { std::cout << "Adding task to timer wheel..." << std::endl; } }; // EventLoop模块 class EventLoop { private: std::thread::id _thread_id; Poller _poll; int _event_fd; std::vector<void(*)()> _task; TimerWheel _timer_wheel; public: EventLoop() { _thread_id = std::this_thread::get_id(); _event_fd = 0; } void doPoll() { _poll.poll(); } void addTimerTask() { _timer_wheel.addTask(); } }; int main() { EventLoop loop; loop.doPoll(); loop.addTimerTask(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tew_gogogo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值