• Linux高性能服务器——状态机


    状态机

    有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑。

    状态之间的转移是需要状态机内部驱动的。

    STATE_MACHINE(){
        State cur_State = type_A;
        while(cur_State != type_C){
            Package _pack = getNewPackage();
            switch(cur_State){
                case type_A:
                    process_package_state_A(_pack);
                    cur_State = type_B;
                    break;
                case type_B:
                    process_package_state_B(_pack);
                    cur_State = type_C;
                    break;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    HTTP 请求的读取和分析

    TCP / IP 协议都在其头部中提供头部长度字段。程序根据该字段的值就可以知道是否接收到一个完整的协议头部。但 HTTP 协议并未提供这样的头部长度字段。根据协议规定,我们判断 HTTP 头部结束的依据是遇到一个空行,该空行仅包含一对回车换行符()。

    如果一次读操作没有读入 HTTP 请求的整个头部,那么必须等待用户继续写数据并再次读入。因此,我们每完成一次读操作,就要分析新读入的数据中是否有空行。不过在寻找空行的过程中,我们可以同时完成对整个 HTTP 请求头部的分析(请求行,头部域),以提高解析 HTTP 请求的效率。

    // P137
    
    • 1

    主从状态机:(主状态机在内部调用从状态机)

    从状态机:

    状态说明
    LINE_OK读取到完整请求并提交到主状态机(初始状态)
    LINE_OPEN未读取到完整请求
    LINE_BAD在一行中单独出现 ,提交到主状态机

    主状态机:

    主状态机的初始状态是 CHECK_STATE_REQUESTLINE,在成功地处理完请求行后,将状态设置为 CHECK_STATE_HEADER,从而实现状态转移。

    状态说明
    CHECK_STATE_REQUESTLINE处理请求行
    CHECK_STATE_HEADER处理头部字段

  • 相关阅读:
    5G-Advanced核心网技术综述
    重温JS——(ES6)异步编程(promise对象、async函数)
    【模型压缩】实例分析量化原理
    Azkaban (二) --------- Azkaban 入门
    synchronized锁升级过程
    使用scales包自定义ggplot2坐标轴刻度和标签
    CN_以太网规格和传输介质@双绞线@基带同轴电缆
    在CSDN上挣点外快的小tips
    Golang 接口原理
    vue 第三方组件按需引入,最后项目的包体积真的变小了吗?
  • 原文地址:https://blog.csdn.net/m0_47665468/article/details/132866624