asio网络编程(一)
asio之socket的创建和连接终端节点的创建
所谓终端节点就是用来通信的端对端的节点,可以通过ip地址和端口构造,其的节点可以连接这个终端节点做通信。
如果我们是客户端,我们可以通过对端的ip和端口构造一个endpoint,用这个endpoint和其通信。
123456789101112131415161718192021int client_end_point() { // 步骤 1. 假设客户端应用程序已经获得了 IP 地址和协议端口号。 std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333; // 用于存储在解析原始 IP 地址时发生的错误信息。 boost::system::error_code ec; // 步骤 2. 使用 IP 协议版本无关的地址表示。 asio::ip::address ip_address = asio::ip::address::from_string(raw_ ...
一起写webserver 项目(五)
webserver类的封装参数和方法123456789101112131415161718192021222324252627282930//基础int m_close_log; // 是否关闭日志int m_is_async; // 日志是否异步char *m_root; // 我们之前服务器上用于存放网页文件的根目录的路径http_conn *users; // 对应所有的客户端int m_listen_fd;int m_TRIGMode;int m_LISTENTrigmode;int m_CONNTrigmode;int m_opt_linger;int m_epoll_fd;int m_pipefd[2];epoll_event events[MAX_EVENT_NUMBER];// 数据库相关connection_pool *m_sql_pool;int m_port;string m_user;string m_password;string m_dbName;int m_sql_num;// 线程池相关thread_pool<http_conn> *m_po ...
一起写webserver 项目(四)
http连接的封装先前我们写的线程,数据库池或者底层的小工具如locker锁等东西是地基,是骨架,那么http解析部分就是主体,是血肉。这是这个项目最关键的部分。
下面是一张简易的框架图,首先说明一下这个WebServer的本质,WebServer的本质上是⼀个⾼性能⽹络框架,它提供了⼀个单服务端(当然也可以扩展为多服务端)与多客户端的⾼效连接框架,但是客户端与服务端连接上以后具体应该做些什么(也就是有哪些业务),这就可以由我们⾃由发挥了,这就是 WebServer 的功能扩展。⽬前⼤多数的WebServer都将从服务端获取MIME作为主要功能。
由于变量和参数过多,先不介绍初始化了,先从设计讲起。
http_conn的设计其中大部分设计都是参考了《Linux高性能服务器编程》
固定的一些方法和变量定义http响应的一些状态信息
123456789const char *ok_200_title = "OK";const char *error_400_title = "Bad Request";const char *error_40 ...
一起写webserver 项目(三)
数据库连接池的封装什么是池
池的概念
“浪费”服务器的硬件资源,以换取其运行效率。
池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源分配。
直接从池中取得所需资源比动态分配资源的速度要快得多,因为分配系统资源的系统调用都是很耗时的
为什么需要数据库连接池?
每个逻辑单元可能都需要频繁地访问本地的某个数据库。
连接池是服务器预先和数据库程序建立的一组连接的集合。当某个逻辑单元需要访问数据库时,它可以直接从连接池中取得一个连接的实体并使用之。待完成数据库的访问之后,逻辑单元再将该连接返还给连接池
单例模式单例模式的好处就不再赘述
1234567891011class connection_pool{public: static connection_pool* Getinstance() { static connection_pool connPool; return &connPool; } private: connection_pool(); ~ ...
一起写webserver 项目(二)
日志和同步原语的封装
写一个项目,一开始不知道从哪里开始,我的经验是大致看一下主函数,了解一下有哪些模块?然后从简单的模块开始逐个看,看完了记住流程思路,我们就可以复现,然后这样虽然阅读起来比整体一行一行看简单,但是各个模块之间相互穿插,单个模块看,理解不了它们之间的关系,所以建议所有模块看完后,再重新看一遍,把整个流程串通,这样整个项目就非常清晰了。
其实我们也可以看作者的Readme的整体框架图
Locker类这里的locker的封装是参考《Linux高性能服务器编程》,用了RAII的思想,即将资源的获取和释放绑定在对象的生命周期中。比较简单就不用怎么叙述了,其实这里完全可以c++的同步原语语法,感兴趣的读者可以自行尝试
信号量
1234567891011121314151617181920212223242526class sem{public: sem(){ if(sem_init(&m_sem,0,0)!=0){ throw std::exception(); } } expli ...
一起写webserver 项目(一)
在做整个项目之前建议看完《Linux高性能服务器编程》-中国-游双,这个项目会用到里面的很多知识。
webserver 环境配置安装Linux环境webserver作为c++的一个经典项目,虽然烂大街,但是对于网络编程和系统编程非常重要,几乎等同于spring于java,可以不用,但基本要会。
选择一个github的项目 GitHub - qinguoyi/TinyWebServer: :fire: Linux下C++轻量级WebServer服务器
我用的是wsl2子系统,发行版是Debian系统,gcc、g++默认都已经安装了,推荐大家用云服务器,这样项目运行访问时就不必是回环地址,这样更贴合生产环境。
安装MYSQL使用apt包管理器:
12sudo apt-get updatesudo apt-get install mysql-server
其他发行版也同理
运行项目然后就是克隆项目运行
12git init ## 将本地仓库初始化git clone <url> ## 将需要的项⽬从 github 上克隆下来,url为项⽬地址
测试前确认已安装MySQL ...
hexo 教程
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
123456#include <iostream>using namespace std;int m ...