![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
玩
范秀河
这个作者很懒,什么都没留下…
展开
-
Linux下的Webserver(5)监听模块4
本模块用来处理客户连接上接收(发送)到的数据。当监听的文件描述符触发EPOLLIN时,将客户连接加入请求队列中,线程竞争来处理该连接。线程判断是读数据还是写数据,调用处理函数.线程按照两种处理模式处理:reactor模式中,主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话立即通知工作线程(逻辑单元 ),读写数据、接受新连接及处理客户请求均在工作线程中完成。通常由同步I/O实现。proactor模式中,主线程和内核负责处理读写数据、接受新连接等I/O操作,工作线程仅负责业务逻辑,原创 2021-07-18 16:48:07 · 458 阅读 · 0 评论 -
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 · 111 阅读 · 0 评论 -
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 · 300 阅读 · 1 评论 -
Linux下的Webserver(5)监听模块1
个人觉得此监听模块是整个项目中最重要的部分,本模块分4个部分第一个部分为服务器接受新的客户连接,处理链接。第二个部分为服务器处理信号第三个部分为处理客户发送的数据第四个部分为发送给客户数据这次讲第一个部分:处理连接。int sockfd = events[i].data.fd; //首先从epoll监听事件中获取触发事件端口 //处理新到的客户连接 if (sockfd == m_listenfd) //监听端口等于监听事件文件描述符原创 2021-06-30 00:36:08 · 208 阅读 · 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 · 656 阅读 · 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 · 230 阅读 · 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 · 148 阅读 · 0 评论