96SEO 2026-02-23 14:29 16
将这个监听文件描述符和本地的IP和端口绑定IP和端口就是服务器的地址信息-

阻塞等待当有客户端发起连接解除阻塞接受客户端的连接会得到一个和客户端通信的套接字
套接字通信的客户端和服务端的实现_呵呵哒(▽)的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132046488?spm1001.2014.3001.5501
m_read_idx索引出开始保存数据大小是READ_BUFFER_SIZE
machine。
有的应用层协议头部包含数据包类型字段每种类型可以映射为逻辑单元的一种执行状态服务器可以根据它来编写相应的处理逻辑。
如下是一种状态独立的有限状态机
这是一个简单的有限状态机只不过该状态机的每个状态都是相互独立的即状态之间没有相互转移。
状态之间的转移是需要状态机内部驱动如下代码
type_A:process_package_state_A(
type_B:process_package_state_B(
变量传递目标状态值来实现状态转移。
那么当状态机进入下一趟循环时它将执行新的状态对应的逻辑。
每项信息之间都需要一个\r\n是由http协议规定************************************************
************************************************
请求体就是浏览器发送给服务器的数据在HTTP报文中每一行的数据有\r\n作为结束字符空行则是仅仅是字符\r\n。
因此可以通过查找\r\n将报文拆解成单独的行进行解析项目中便是利用了这一点。
http请求报文与响应报文_构造http请求报文,发送到天气预报的服务器,并获取http响应报文,将报文进行解析获_JSon
liu的博客-CSDN博客https://blog.csdn.net/weixin_45912307/article/details/109454522
(tencent.com)https://cloud.tencent.com/developer/article/1953222我的往期文章Web服务器简介及HTTP协议_呵呵哒(▽)的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132610837?spm1001.2014.3001.5501
负责读取buffer中的数据将每行数据末尾的\r\n置为\0\0并更新从状态机在buffer中读取的位置m_checked_idx从此来驱动主状态机解析
从状态机从m_read_buf中逐字节读取判断当前字节是否为\r
接下来的字符是\n将\r\n修改成\0\0将m_checked_idx指向下一行的开头则返回LINE_OK然后达到了buffer末尾表示buffer还需要继续接收返回LINE_OPEN否则表示语法错误返回LINE_BAD
一般是上次读取到\r就到了buffer末尾没有接收完整再次接收时会出现这种情况。
【判断】如果前一个字符是\r则将\r\n修改成\0\0将m_checked_idx指向下一行的开头则返回LINE_OK
/*从状态机用于分析出一行内容返回值为行的读取状态由LINE_OKLINE_BADLINE_OPENm_read_idx:指向缓冲区m_read_buf的数据末尾的下一个字节m_checked_idx:指向从状态机当前正在分析的字节
2主从状态机http_conn::process_read()
parse_request_line()CHECK_STATE_HEADER
parse_headers()CHECK_STATE_CONTENT
对于GET请求根据具体的请求信息进行预处理分析目标文件属性并将其映射到内存地址m_file_address处
主从状态机模式http_conn::process_read()用以应对不同的状态处理。
一个状态机作为主要的控制器而其他状态机则被设计为从状态机主状态机将它们之间的通信和事件处理进行协调主状态机是在系统启动时创建的从状态机可以在系统运行时动态创建、注册或注销
表示若当前正在解析请求体并且从状态机已经成功解析了一行请求数据则需要继续解析下一行请求数据
或者从状态机还未成功解析出一行完整的请求数据就需要不断循环调用从状态机、解析请求数据
这里主状态机指的是process_read()函数从状态机指的是parse_line()while
GET/*通过请求行的解析我们可以判断该HTTP请求的类型GET/POST而请求行中最重要的部分就是URL部分将这部分保存下来用于后面的生成HTTP响应*/ret
{//遇到换行符就默认你解析完请求头不管后面还有没有内容return
do_request();//解析具体的请求信息}break;}case
{/*解析请求数据对于GET来说这部分是空的因为这部分内容已经以明文的方式包含在了请求行中的URL部分了只有POST的这部分是有数据的*/ret
POST请求登录、注册、请求图片、视频等等做不同的预处理然后分析目标文件的属性若目标文件存在、对所有用户可读且不是目录时则使用mmap将其映射到内存地址m_file_address处并告诉调用者获取文件成功*/return
/*m_start_line是行在bufffer中的起始位置将该位置后面的数据赋给text此时从状态机已提前将一行的末尾字符\r\n变为\0\0,所以text可以直接取出完整的行进行解析
主状态机初始状态是CHECK_STATE_REQUESTLINE,通过调用从状态机来驱动主状态机在主状态机进行解析前从状态机已经将每一行的末尾\r\n符号改为\0\0以便于主状态机直接取出对应字符串进行处理。
主状态机的初始状态调用parse_request_line函数解析请求行解析函数从m_read_buf中解析HTTP请求行获得请求方法目标URL及HTTP版本号解析完成后主状态机的状态变为CHECK_STATE_HEADER
http_conn::parse_request_line(char*
在HTTP报文中请求行用来说明请求类型要访问的资源以及所使用的HTTP版本//
http://192.168.110.129:10000/index.html*
这里主要是有些报文的请求资源中会带有http://这里需要对这种情况进行单独处理*/if
一般的不会带有上述两种符号直接是单独的/或/后面带访问资源if
请求行处理完毕将主状态机转移处理请求头m_check_state
解析完请求行后主状态机继续分析请求头。
在报文中请求头和空行的处理使用的同一个函数这里通过判断当前的text首位是不是\0字符。
调用parse_headers函数解析请求头部信息判断是空行还是请求头。
若是空行进而判断Content-length是否为0如果不是0表明是POST请求则状态转移到CHECK_STATE_CONTENT否则说明是GET则报文解析结束若解析的是请求头部字段则主要分析Connection字段Content-length字段等Connection字段判断是keep-alive
close决定是长连接还是短连接;如果是长连接则将linger标志设置为trueContent-length字段这里用于读取post请求的消息体长度
请求/*如果HTTP请求有消息体则还需要读取m_content_length字节的消息体状态机转移到CHECK_STATE_CONTENT状态*/if
如果是长连接则将linger标志设置为truem_linger
GET和POST请求报文的区别之一是有无消息体部分。
GET请求没有消息体当解析完空行之后便完成了报文的解析。
仅用从状态机的状态(line_status
所以无法使用从状态机的状态转而使用主状态机的状态作为循环入口条件
解析完消息体之后报文的完整解析也就完成了此时主状态机的状态还是CHECK_STATE_CONTENT。
意味着符合循环入口条件还会再次进入循环。
为此需要在完成请求体解析后将line_status变量更改为LINE_OPEN便可跳出循环完成报文解析任务
在完成请求体解析后将line_status变量更改为LINE_OPEN,跳出循环完成报文解析任务line_status
仅用于解析POST请求调用parse_content函数解析请求体用于保存post请求消息体为后面的登录和注册做准备
我们没有真正解析HTTP请求的消息体只是判断它是否被完整的读入了
(qq.com)https://mp.weixin.qq.com/s?__bizMzAxNzU2MzcwMwmid2649274278idx7snd1ab62872c3ddac765d2d80bbebfb0ddchksm83ffbefeb48837e808caad089f23c340e1348efb94bef88be355f4d9aedb0f9784e1f9e072b1scene178cur_album_id1339230165934882817#rd【从0开始编写webserver·基础篇#02】服务器的核心---I/O处理单元和任务类
(cnblogs.com)https://www.cnblogs.com/DAYceng/p/17418584.html#%E5%A4%84%E7%90%86%E6%96%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E8%BF%9E%E6%8E%A5%E8%AF%B7%E6%B1%82
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback