websever
1 在浏览器键入url,按下回车会经历如下行为
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
浏览器发出读取文件( URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
释放 TCP 连接;
浏览器将该 HTML 文本并显示内容。
2 两种高效的事件处理模式
Reactor 和 Proactor ,同步 I/O 模型通常用于实现 Reactor 模式,异步 I/O 模型通常用于实现 Proactor 模式。
Reactor和Proactor模式的主要区别就是真正的读取和写入操作是由谁来完成的。
Reactor来了事件操作系统通知应用进程,让应用进程来处理;
Proactor来了事件操作系统来处理,处理完再通知应用进程。
Reactor模式:


3 EPOLLONESHOT事件
即使可以使用 ET 模式,一个 socket 上的某个事件还是可能被触发多次。因为在ET模式下事件只有状态发生变化时才触发通知,比如读缓冲区有了新的可读数据,或者写缓冲区有空位可以写入时。
而这在并发程序中就会引起一个问题。比如读事件被触发时,一个线程被唤醒来处理数据,而在数据的处理过程中该文件描述符上又有新数据可读( EPOLLIN 再次被触发),此时另外一个线程被唤醒来读取这些新的数据。
于是就出现了两个线程同时操作一个 socket 的局面。一个 socket 连接在任一时刻都只被一个线程处理,可以使用 epoll 的 EPOLLONESHOT 事件实现。
对于注册了 EPOLLONESHOT 事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,除非我们使用 epoll_ctl 函数重置该文件描述符上注册的 EPOLLONESHOT 事件。这样,当一个线程在处理某个 socket 时,其他线程是不可能有机会操作该 socket 的。
但反过来思考,注册了 EPOLLONESHOT 事件的 socket 一旦被某个线程处理完毕, 该线程就应该立即重置这个socket 上的 EPOLLONESHOT 事件,以确保这个 socket 下一次可读时,其 EPOLLIN 事件能被触发,进而让其他工作线程有机会继续处理这个 socket 。
4 SIGPIPE信号详解
当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了,而该信号会默认结束进程。
为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:signal(SIGPIPE, SIG_IGN);
在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。调用以下代码,即可安全的屏蔽SIGPIPE:signal (SIGPIPE, SIG_IGN);
5 SIGALARM和SIGTERM
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号,通常用来要求程序自己正常退出
6 websever实现流程概述
牛客上的websever是用同步IO模拟实现Proactor模式,但个人认为这样相比于Reactor模式没有什么区别,仅仅是把读写操作从工作线程中抽离了出来,由主线程进行读写,并非达到了真正的异步IO的效用,所以要是介绍项目的时候个人认为还是描述成Reactor模式比较好
主线程准备工作:
- 通过main的参数获取有效端口号
- 设置SIGPIPE信号的捕捉忽略处理
- 创建监听socket,设置端口复用来及时释放端口并重用,绑定地址信息
- 创建epoll对象并添加要监听的fd
- 创建管道,用于对SIGALRM和SIGTERM的信号捕捉通知,写管道设置非阻塞,读管道加入epoll检测
- 初始化http_conn类的客户端数组users,共用一个epoll_fd的定时器链表;初始化线程池,动态创建线程,设置线程分离;设定定时器
- 开始监听套接字连接
- epoll_wait阻塞等待事件的发生
主线程循环遍历事件数组处理不同的事件:

工作线程解析http报文

7 参考
websever的更多相关文章
- vs中发布WebSever时启用HTTP-POST和HTTP-GET这两种协议
一.问题介绍 在vs中建立一个websever项目时候默认是禁用HTTP-POST和HTTP-GET这两种协议的.但是如果你是在本机上去调试或者是在iis中浏览都会有HTTP-POST这种方式,因为这 ...
- Goahead WebSever 总结
编译成功后用http://127.0.0.1可以访问网站,若端口号不是默认的80,者访问时加“:端口”,如: http://127.0.0.1:8888 1.websHomePageHandler函数 ...
- 三、jQuery--jQuery实践--搜索框制作
input标签讲解 <input/>作为按钮的type属性:button.submit(后面会有二者对比分析)
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- web后门排查与高效分析web日志技巧
今年一直大大小小的事情忙,很少有时间能静下心写个文章,所以最近博客更新也越来越少了,公司现在安全团队在我这边,一直在玩命的招人.下个月8号有一个互联网金融的会,4月在qcon北京站,都以嘉宾的身份去分 ...
- Linux Lab
ssh vi /etc/apt/sources.list su ssh username@ipaddress eg : ssh root@172.16.247.143 实验一 fdisk /dev/s ...
- boa-0.94.13:Hello CGI
CGI是什么 CGI全称是CommonGateway Interface,简称CGI,中文名叫做通用网关接口. CGI程序就是符合CGI接口规范的程序,相对于WebServer来说也叫外部程序. CG ...
- external 里面文件的介绍
搞了半天android,竟然对external下的库一无所知?不能容忍! 马上解决: android-mock:编译为java静态库.说明:Android Mock is a framework fo ...
- 配置rpm本地源及局域网环境下使用
LInux个人开发过程中可以直接连到公网,所以想要安装各种软件时直接安装即可,但工作环境往往很让人头疼. 如果应用场景是没法链接外网的,公司内部绝大多数情况下是在自己的局域网下玩,这时候想装个软件是相 ...
- webAPI 上传文件 404错误(转载)
webAPI文件上传时文件过大404错误的问题 来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...
随机推荐
- Linux 运维人员最常用 150+命令汇总
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...
- 关于win11系统修改用户名导致登录进入不了系统的坑
背景:公司的新电脑,win11系统,开机进入需要注册用户名和密码,在取用户名的时候,手快没注意取了一个中文名,结果这给我后面的工作带来了一个坑,我在用mysqlworkbench进行数据备份,需要对数 ...
- 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
六.用go语言,考虑一棵二叉搜索树 T ,其关键字互不相同.证明:如果 T 中一个结点 x 的右子树为空,且 x 有一个后继 y ,那么 y 一定是 x 的最底层祖先,并且其左孩子也是 x 的祖先.( ...
- 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识
原文地址 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识 zz 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证 ...
- JQuery_1
1.概念:一个JavaScript框架.简化js开发 JavaScript框架:本质上就是一些js文件,封装了js的原生代码. 2.快速入门: 1.步骤 1.下载JQuery jquery.xxx.j ...
- ssm整合-异常处理器
异常处理器 程序开发过程中不可避免会遇到异常现象 类似于这样的异常 异常出现的种类: 各个层均可能出现异常,当我们出现异常时,处理代码应该写在哪一层? 表现层,因为要把异常网上抛,在表现层进行 ...
- 新版本下如何通过外部网络访问wsl
众所周知,wsl2是windows下的linux子系统,并且采用类似于虚拟机NAT的管理方式.一般情况下,外部网络很难直接访问到wsl上的服务,除非使用端口转发.而现在,微软更新了wsl 2.0.0, ...
- Chrome扩展的核心:manifest 文件(下)
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 在上篇和中篇中已经完成了对 manifest 文件中以下字段的解释: "manifest_ ...
- Vue绑定Style和Class写法
vue2写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- ModuleNotFoundError: No module named '_pytest.resultlog'
新环境运行Python时报错 ModuleNotFoundError: No module named '_pytest.resultlog' 上网查,看到解决方法 https://www.cnbl ...