- 博客(10)
- 收藏
- 关注
原创 NanoLog源码(二)编码与解码
编码就是将需要格式化的内容转换成对应类型写入缓冲区。template < typename Arg > void encode(Arg arg); template < typename Arg > void encode(Arg arg, uint8_t type_id); void encode(char * arg); void encode(char const * arg); void encode(string_literal_t arg); voi
2021-10-12 23:31:17
553
原创 NanoLog源码(一)整体逻辑
C++11 NanoLog:https://github.com/Iyengar111/NanoLogNanoLog基本思想:由于格式化非常耗时,所以NanoLog使用线程保存格式化后的内容,待写入日志的全部放在存储类中,每个日志内容都有类型,目前支持int/uint/double/string/char/char*这些类型。个人理解:整个NanoLog 分为存储类,线程读写,编码格式化。NanoLog写的全过程:第一步:LOG_INFO LOG_WARNLOG_INFO<<(
2021-10-11 19:29:20
1041
原创 Linux下的Webserver(5)监听模块4
本模块用来处理客户连接上接收(发送)到的数据。当监听的文件描述符触发EPOLLIN时,将客户连接加入请求队列中,线程竞争来处理该连接。线程判断是读数据还是写数据,调用处理函数.线程按照两种处理模式处理:reactor模式中,主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话立即通知工作线程(逻辑单元 ),读写数据、接受新连接及处理客户请求均在工作线程中完成。通常由同步I/O实现。proactor模式中,主线程和内核负责处理读写数据、接受新连接等I/O操作,工作线程仅负责业务逻辑,
2021-07-18 16:48:07
536
原创 Linux下的Webserver(5)监听模块3
本模块用来处理客户端断开连接。 if (events[i].events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)) //当监听的文件描述符发生 读关闭 |读写都关闭|发生错误 时 { //服务器端关闭连接,移除对应的定时器 util_timer *timer = users_timer[sockfd].timer; //获得文件描述符对应的定时器 deal_timer(timer, sockfd); }void WebSe
2021-07-15 15:29:16
151
原创 Linux下的Webserver(5)监听模块2
本模块为处理信号,信号用管道进行通信,用epoll监听管道的读端0。写端1写入信号。ret = socketpair(PF_UNIX, SOCK_STREAM, 0, m_pipefd);//将m_pipefd创建一对互相连接着的socket描述符。//每一个套接字既可以读也可以写。例如,可以往sv[0]中写,从sv[1]中读;或者从sv[1]中写,从sv[0]中读; assert(ret != -1); utils.setnonblocking(m_pipefd[1]);//写段非
2021-07-14 17:14:34
394
1
原创 Linux下的Webserver(5)监听模块1
个人觉得此监听模块是整个项目中最重要的部分,本模块分4个部分第一个部分为服务器接受新的客户连接,处理链接。第二个部分为服务器处理信号第三个部分为处理客户发送的数据第四个部分为发送给客户数据这次讲第一个部分:处理连接。int sockfd = events[i].data.fd; //首先从epoll监听事件中获取触发事件端口 //处理新到的客户连接 if (sockfd == m_listenfd) //监听端口等于监听事件文件描述符
2021-06-30 00:36:08
259
1
原创 Linux下的Webserver(4)定时器模块
定时器采用链表存储,方便插入,升序的排序链表。定时器作用:为了防止某些连接只发送一次数据后就不发送数据了,影响服务器的性能。因此每当连接发送一次数据时,则重置该连接的时间。超过定时就从链表中删除。alarm函数周期性地触发SIGALRM信号,信号的处理函数利用管道通知主循环执行定时器链表上的定时任务.利用管道通知定时器socketpair(PF_UNIX, SOCK_STREAM, 0, m_pipefd); //设置一个信号的管道utils.setnonblocking(m_pipefd[1])
2021-06-24 23:53:38
772
3
原创 Linux下的Webserver(3)线程池模块
线程池的优点:1:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。3:提高线程的可管理性。多线程函数pthread_create函数 创建一个新线程。int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);参数1:传出参数,保存系统为我们分
2021-06-24 00:41:40
314
1
原创 Linux下的Webserver(2)数据库模块
数据库模块的功能:验证客户端登录。单例模式与上一节的日志模块功能相同。 保证只能一个数据库对象 connection_pool* connection_pool::Getinstance()//{ static connection_pool connpool; return &connpool;}数据库连接池1.使用链表实现,静态大小的连接容量。2.数据库对象初始化连接池时,传入MYSQL初始化后的对象。3.传入完成后要信号量的大小,大小为数据池的大
2021-06-22 16:52:32
180
原创 Linux下的Webserver(1)目录模块
本目录模块作用是记录系统可能发生的各种情况以下记录一些个人在目录模块所理解的知识点。一:单例模式单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;// 单例模式 将构造函数私有化static LOG*get_instance() {static Log instance; return &instance; }函数返回值为static,接收静态变量。 static修饰变量,使变
2021-06-21 22:43:51
449
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人