WebServer服务器开发的基本逻辑
写在前面:
项目采用的是单Reactor+线程池的模型
单Reactor服务器模型即只有一个主线程运行Reactor。整个线程只有一个epoll句柄,用于管理所有套接字,包括listenfd(监听套接字)、clientfd(通信套接字)。
首先,服务器将自己的listenfd注册到epoll上。当epoll_wait返回时,说明有新的事件。判断事件类型后进行相应操作:
- 如果是listenfd,说明有新的连接请求,这时调用accept函数获取新连接clientfd,并将该clientfd也注册到epoll上,等待clientfd发生读写事件从epoll_wait返回后,再处理clientfd事件。
- 如果是clientfd发生的读写事件,需要进行业务逻辑处理,这里实现一个线程池,将业务逻辑处理交给线程池中的一个线程来做。主线程继续进行reactor循环。
一些基本知识
- 文件描述符
在tcp的服务器端,有两类文件描述符。
监听的文件描述符
只需要有一个
不负责和客户端通信,只负责检测客户端的连接请求,检测到有新的请求,用accept()建立新的连接
通信的文件描述符
负责和建立连接的客户端通信
如果有N个客户端和服务器建立了新的连接,通信的文件描述符就有N个,每个客户端和服务器都对应一个通信的文件描述符
- 服务器端通信流程
1.创建一个用于监听的套接字,这个套接字是一个文件描述符
int listenfd = socket()
2.将得到的监听的文件描述符和本地的IP端口进行绑定
bind()
3.设置监听,绑定成功之后开始监听,监听客户端的连接
listen()
4.等待并接受客户端的连接请求,建立新的连接,得到一个新的文件描述符(通信描述符)
accept如果没有新的连接请求就阻塞
int clientfd = accept()
5.通信
读写操作都是阻塞的
read();/write();
6.断开,关闭套接字
clost()
- Reactor模式
是事件驱动机制。逆转了事件处理的流程,不再是主动等待事件就绪,而是有提前注册好的回调函数,当有对应事件发生时就调用回调函数。
- 阻塞
这里的前提是listenfd或clientfd设置为了阻塞模式。
accept函数获取客户端连接是阻塞的,必须要等待能获取新连接之后,accept函数才会返回。
客户端连接后,调用read或write也是阻塞的,必须等待clientfd套接字满足可读或可写条件后才会返回。
- 非阻塞
这里的前提是listenfd或clientfd设置为了非阻塞模式。
accept函数获取客户端连接,如果有就返回,没有也不会阻塞等待而是立即返回。
客户端连接后,调用read或write,有读或写的内容就执行,否则也不会阻塞而是立即返回。
项目具体流程
- WebServer类在初始化时:
1.创建一个用于监听的套接字,这个套接字是一个文件描述符
int listenfd = socket()
2.将得到的监听的文件描述符和本地的IP端口进行绑定
bind()
3.设置监听,绑定成功之后开始监听,监听客户端的连接
listen()
4.将该listenfd注册到epoll上
设置文件描述符非阻塞
- WebServer在启动(start)后
调用epoll_wait处理
有关心的事件发生,epoll_wait会主动返回,此时我们去处理发生了IO事件响应的套接字即可
判断该事件类型:
如果是建立新连接的,就调用accept,得到通信文件描述符,并将其再次注册到epoll上
如果是读写事件,就从线程池里取出一个线程进行处理。
WebServer服务器开发的基本逻辑相关推荐
- 可以运行vivado的云服务器,百度云服务器FPGA标准开发环境的逻辑开发与编译示例 - 全文...
镜像是云服务器实例运行环境的模板,包括操作系统和预装软件等配置.百度云为每个FPGA实例默认提供了专属公共镜像,用户可以按需选择适合的镜像类型. 概述 基于百度云自研的FPGA加速卡,提供了一套FPG ...
- 这可能是东半球最保姆级的后台服务器开发学习路线
作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...
- 深入浅出Node.js游戏服务器开发--分布式聊天服务器搭建
From: http://www.infoq.com/cn/articles/game-server-development-2?utm_source=infoq&utm_medium=rel ...
- 游戏服务器开发技术小结
转载请自觉标明原创出处 原文链接:http://gameislife.info/archives/category/游戏开发 游戏服务器开发技术小结 1 概述 本文从开发者的视角,浅析游戏服务器 ...
- 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...
- Linux 高并发服务器开发
该文章是通过观看牛客网的视频整理所得,以及在实践过程中遇到的问题及解决方案的整理总结. Linux 高并发服务器开发 linux 系统编程 linux 环境的搭建 环境搭建需要的软件 虚拟机中安装 u ...
- 后台服务器开发都要会些啥?| 内卷么?
前言 大家好,我是石头哥.上周的文章鸽了,因为跑去"北方小桂林"玩了一圈.风景还不错,给大家看看. 这是一张航拍的全景图,我的小飞机时隔一年终于派上用场了. 当然,你识别下面的小程 ...
- 后台服务器开发学习指南(建议收藏)
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学 ...
- linux高性能服务器开发十大必须掌握的核心技术
推荐视频: 全网最详细epoll讲解,6种epoll的设计,让你吊打面试官 150行代码,带你手写线程池,自行准备linux环境 40k技术专家的linux服务器性能优化方法论,异步的效率 c/c++ ...
- 服务器系统摁c,如何系统有效学习c服务器开发
学海无涯苦作舟,学习当然是一个枯燥的过程.学习c服务器开发,表面上程序漂漂亮亮风光无限,程序员是把美丽献给别人,把枯燥留给自己的职业.不过还是许多人想要学习,为此,以下是学习啦小编分享给大家的学习c服 ...
最新文章
- Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置
- pythondocx批量提取目录及内容_一个可以选择目录生成doc目录内容的小工具(三) -python-docx...
- JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
- mysql5.1 mysiam_MySQL 数据库清理MyISAM Innodb表(支持MySQL5.1.6以上的版本)
- 【转】SharePoint 2013 开发——开发并部署webpart
- PHP向服务器错误记录、文件或远程目标发送一个错误
- 第一个应用成功上架了-武林世界
- SpreadJS 14.1 Crack by Xacker
- python3学习笔记---类
- 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——7 - Kids On The Track(生死时刻)
- testflight测试的直播软件,TestFlight - Apple
- NRF24L01实验(STM32F103ZE与STM32L475ZE通信)
- python发微信工资条_使用python自动发放员工工资条到个人邮箱
- 第七章、绘制3D图表和统计地图
- 5G中的一些简写和缩略语含义
- tableau数据分析
- 主机电源全是黑线怎么短接_电脑电源故障 绿线和黑线短接后风扇转一下就停了。...
- docker项目切换(nginx)、重启shell 脚本
- JME3 官方教程翻译 - 自定义网格形状
- js 的json转数组,数组转json