【web server】整体流程解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【web server】整体流程解析

本篇从main函数开始,解析程序运行整体流程:

流程图非常清晰,开始时初始化日志系统,记录程序运行中产生的日志信息,通过getopt读取启动选项,之后进行server的初始化工作,并开启server

启动选项可以选择是否以守护进程的方式运行,以及指定监听的端口号,若不指定端口号,则默认监听在配置文件server.conf中的8080端口。

之后进行server的初始化。包括读取配置文件,创建socket,初始化线程池,定时器等。线程池中创建多个线程抢任务队列中的任务执行。定时器用来计时,长时间不活跃的socket将会被关闭。

往下,进入epoll_wait阻塞,事件类型可以分为四种:

新用户连接
出错事件
可读事件
可写事件

对于四种事件,分别去做不同的处理。

其中可读可写事件,均采用proactor模式,即主线程负责读写,工作线程负责处理业务逻辑。

if (events[i].events & EPOLLIN) {
  //可读事件
    DBG("read\n");
  //主线程读,proactor模式
  if (m_pHttpUsers[iSockFd].read()) {
    //添加任务
    m_pThreadPool->append(m_pHttpUsers + iSockFd);
    ...
  }
} else if (events[i].events & EPOLLOUT) {
  //可写事件
  DBG("out\n");
  //主线程写,proactor模式
  if (m_pHttpUsers[iSockFd].mwrite()) {
    ...
  }
}

对于可读事件,主线程读取完数据后,将任务(读完了要解析数据的任务)加到任务队列中,多个线程抢任务执行:

//添加任务
template<typename T>
bool threadpool<T>::append(T *request) {
  m_queuelocker.lock();
  if (m_workqueue.size() > m_max_requests) {
    m_queuelocker.unlock();
    return false;
  }
  m_workqueue.push_back(request);
  m_queuelocker.unlock();
  m_queuestat.post();
  return true;
}
//work
template<typename T>
void *threadpool<T>::worker(void *arg) {
  threadpool *pool = (threadpool *)arg;
  pool->run();
  return pool;
}
//等任务,取任务,执行
template<typename T>
void threadpool<T>::run() {
  while (!m_stop) {
    m_queuestat.wait();
    m_queuelocker.lock();
    if (m_workqueue.empty()) {
      m_queuelocker.unlock();
      continue;
    }
    T *request = m_workqueue.front();
    m_workqueue.pop_front();
    m_queuelocker.unlock();
    if (!request) {
      continue;
    }
    request->process();
  }
}

在process中执行任务:

void Http::process() {
  //处理读进来的数据
  HTTP_CODE read_ret = process_read();
  if (read_ret == NO_REQUEST) {
    modfd(s_iEpollfd, m_iSockFd, EPOLLIN);
    return ;
  }
  bool write_ret = process_write(read_ret);
  if (!write_ret) {
    close_conn();
  }
  modfd(s_iEpollfd, m_iSockFd, EPOLLOUT);
}

首先处理(解析)读来的数据,当发现该请求需要返回时,执行写操作,修改该socketEPOLLOUT,这样主线程发现该socket可写,便执行写操作。

这便是程序运行整体流程。

至于如何解析读来的数据,即解析HTTP协议,以及定时器如何关闭长事件不活跃的连接,就可以单独作为一个模块,之后的文章将会总结。

相关文章
|
27天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
3天前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
|
9天前
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
37 4
|
9天前
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
32 2
|
25天前
|
前端开发 开发者 容器
构建响应式Web界面:Flexbox与Grid布局的深度解析
【10月更文挑战第11天】本文深入解析了CSS3中的Flexbox和Grid布局,探讨了它们的特点、应用场景及使用方法。Flexbox适用于一维布局,如导航栏;Grid布局则适用于二维布局,如复杂网格。通过示例代码和核心属性介绍,帮助开发者灵活构建响应式Web界面。
47 5
|
23天前
|
敏捷开发 数据可视化 测试技术
解析软件项目管理:以板栗看板为例,其如何有效影响并优化软件开发流程
软件项目管理是一个复杂而重要的过程,涵盖了软件产品的创建、维护和优化。其核心目标是确保软件项目能够顺利完成,同时满足预定的质量、时间和预算目标。本文将深入探讨软件项目管理的内涵及其对软件开发过程的影响,并介绍一些有效的管理工具。
|
9天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
85 44
|
4天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
13 1
|
7天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
10天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
26 2

推荐镜像

更多
下一篇
无影云桌面