目录
本部分主要接着上一节,完成 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