“Web 服务器” 笔记03 ------ 解析HTTP请求报文

本文详细介绍了HTTP请求报文的解析过程,包括工作流程、数据缓冲、recv()函数的使用、状态机的设计以及解析请求行、请求首部和请求体的方法。重点讲解了如何通过状态机高效地处理HTTP请求,并提供了具体的解析函数解析请求行和请求首部。
摘要由CSDN通过智能技术生成

目录

1、工作流程

2、数据缓冲

3、recv( ) 函数

4、任何判断 recv( ) 函数从fd中读完数据

5、套接字 socket 编程非阻塞

6、状态机

7、parse_line 解析

8、解析请求行、请求首部和请求体

9、HTTP请求报文和HTTP响应报文

10、do_request 解析

附录


本部分主要接着上一节,完成 HTTP 请求报文的解析。

该节主要完成 read( ) 、process_read( ) 、get_line( ) 、parse_line( ) 、parse_request_line( ) 、parse_headers( ) 、parse_content( ) 和 do_request( ) 的编写;

1、工作流程

2、数据缓冲

 

3、recv( ) 函数

不论是客户端还是服务器应用程序都用 recv 函数从 TCP 连接的另一端接收数据。

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recv(int __fd, void *__buf, size_t __n, int __flags)
    - 功能:从socket fd中读取N个字节的数到buf中
    - 参数:
        - fd:要读取数据的socket文件描述符,,其实就是客户端对应的套接字文件描述符
        - buf:指向接受的数据所在的缓冲区
        - n:缓冲区的最大尺寸,sizeof()
        - flags:置0就完事了
    - 返回值:
        - 成功:读取到的字节数N
        - 失败:-1
    Read N bytes into BUF from socket FD.
    Returns the number read or -1 for errors.

一些错误码:(man recv)

  • EAGAIN or EWOULDBLOCK:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
  • EBADF:sockfd 参数是一个无效的文件描述符
  • ECONNREFUSED:远程主机拒绝网络连接(通常是因为它没有运行所请求的服务)
  • EFAULT:接收缓冲区指针指向进程地址空间之外
  • EINTR:操作被信号中断
  • EINVAL:无效的参数传递
  • ENOMEM:内存不足
  • ENOTCONN:与面向连接关联的套接字尚未被连接上
  • ENOTSOCK:sock索引的不是套接字

4、任何判断 recv( ) 函数从fd中读完数据

有时 socket_fd 中的数据不能一次被 recv 读完,需要循环 recv 去读。这里 m_read_buf 为读缓冲指针(即读缓冲的首地址),m_read_idx 为标识读缓冲区中已经读入的客户端数据的最后一个字节的下一个位置。下一次读取的数据放到读缓冲的以 m_read_buf + m_re

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值