写在前面:

项目采用的是单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服务器开发的基本逻辑相关推荐

  1. 可以运行vivado的云服务器,百度云服务器FPGA标准开发环境的逻辑开发与编译示例 - 全文...

    镜像是云服务器实例运行环境的模板,包括操作系统和预装软件等配置.百度云为每个FPGA实例默认提供了专属公共镜像,用户可以按需选择适合的镜像类型. 概述 基于百度云自研的FPGA加速卡,提供了一套FPG ...

  2. 这可能是东半球最保姆级的后台服务器开发学习路线

    作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...

  3. 深入浅出Node.js游戏服务器开发--分布式聊天服务器搭建

    From: http://www.infoq.com/cn/articles/game-server-development-2?utm_source=infoq&utm_medium=rel ...

  4. 游戏服务器开发技术小结

    转载请自觉标明原创出处 原文链接:http://gameislife.info/archives/category/游戏开发    游戏服务器开发技术小结 1 概述 本文从开发者的视角,浅析游戏服务器 ...

  5. 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线

    前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...

  6. Linux 高并发服务器开发

    该文章是通过观看牛客网的视频整理所得,以及在实践过程中遇到的问题及解决方案的整理总结. Linux 高并发服务器开发 linux 系统编程 linux 环境的搭建 环境搭建需要的软件 虚拟机中安装 u ...

  7. 后台服务器开发都要会些啥?| 内卷么?

    前言 大家好,我是石头哥.上周的文章鸽了,因为跑去"北方小桂林"玩了一圈.风景还不错,给大家看看. 这是一张航拍的全景图,我的小飞机时隔一年终于派上用场了. 当然,你识别下面的小程 ...

  8. 后台服务器开发学习指南(建议收藏)

    前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学 ...

  9. linux高性能服务器开发十大必须掌握的核心技术

    推荐视频: 全网最详细epoll讲解,6种epoll的设计,让你吊打面试官 150行代码,带你手写线程池,自行准备linux环境 40k技术专家的linux服务器性能优化方法论,异步的效率 c/c++ ...

  10. 服务器系统摁c,如何系统有效学习c服务器开发

    学海无涯苦作舟,学习当然是一个枯燥的过程.学习c服务器开发,表面上程序漂漂亮亮风光无限,程序员是把美丽献给别人,把枯燥留给自己的职业.不过还是许多人想要学习,为此,以下是学习啦小编分享给大家的学习c服 ...

最新文章

  1. Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置
  2. pythondocx批量提取目录及内容_一个可以选择目录生成doc目录内容的小工具(三) -python-docx...
  3. JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
  4. mysql5.1 mysiam_MySQL 数据库清理MyISAM Innodb表(支持MySQL5.1.6以上的版本)
  5. 【转】SharePoint 2013 开发——开发并部署webpart
  6. PHP向服务器错误记录、文件或远程目标发送一个错误
  7. 第一个应用成功上架了-武林世界
  8. SpreadJS 14.1 Crack by Xacker
  9. python3学习笔记---类
  10. 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——7 - Kids On The Track(生死时刻)
  11. testflight测试的直播软件,TestFlight - Apple
  12. NRF24L01实验(STM32F103ZE与STM32L475ZE通信)
  13. python发微信工资条_使用python自动发放员工工资条到个人邮箱
  14. 第七章、绘制3D图表和统计地图
  15. 5G中的一些简写和缩略语含义
  16. tableau数据分析
  17. 主机电源全是黑线怎么短接_电脑电源故障 绿线和黑线短接后风扇转一下就停了。...
  18. docker项目切换(nginx)、重启shell 脚本
  19. JME3 官方教程翻译 - 自定义网格形状
  20. js 的json转数组,数组转json

热门文章

  1. 个人博客系统(附源码)
  2. Linux访问交换机FTP,华为交换机使用FTP查看下载文件
  3. SUMO文档019:导入网络文件(上)——OpenStreetMap
  4. 小米max android7 root,小米Max第三方Rom-Lineage OS
  5. 上班按小时的怎么记,小时工计时怎么用便签记上个月的工时
  6. live2d手机制作软件_live2d制作器手机版
  7. 路由跟踪之tcptraceroute IP延时之tcpping
  8. 如何安装JAVASE平台
  9. MATLAB程序中启动其他软件
  10. 君正T31 ACC解码