tinyhttpd学习笔记:过程的文字描述

socket的完整过程:

1.创建server端、client端的套接口server_sockclient_sock

2.创建client端的sockaddr_in的结构体client_name


startup函数:
int startup(*port):
1.server端创建满足一定类型(例如:IPv4)、一定协议(例如:TCP)的套接口httpd

2.创建server端的sockaddr_in的结构体name

包含:
地址族(例如:AF_INET)
IP地址addr(例如:127.0.0.1)
端口port(例如:1234)的信息

3.设置套接口httpd的属性(例如:SO_REUSEADDR释放后可立即再次重用)

4.server端将套接口httpd和结构体name的IP地址和端口,绑定(bind)起来。这样,流经该 IP 地址和端口的数据才能交给套接字处理。。若端口为0,则动态分配端口

类似地,客户端也要用 connect() 函数建立连接。

5.让套接口httpd进入被动监听(listen)状态,并设置等待的请求数的上限(backlog)

当套接字处于监听状态时,可以通过 accept() 函数来接收client端请求

6.返回各种属性设置完毕的套接口httpd


3.startup函数将设置完毕的套接口httpd赋给server端的套接口server_sock

4.当client端有通信请求时,accept()函数利用client端结构体client_name保存client端的IP地址和端口号,并返回一个新的套接口赋给client套接口client_sock

5.accept_request()函数将client端套接口client_sock发送的信息,也就是http请求的header经过“转换成换行”处理后,存放在缓存区buf

6.提取buf中的请求方法method,判断请求方法属于GET还是POST;若请求为POST,则通用网关接口cgi=1

7.提取buf中的网络地址url,若含有query,即带参数GET,则cgi=1;

8.将url修改成前缀为htdocs,后缀为index.html的路径path。 格式化 urlpath 数组,表示浏览器请求的服务器文件路径,

在 tinyhttpd 中服务器文件是在 htdocs 文件夹下。
当 url 以 / 结尾,或 url 是个目录,则默认在 path 中加上 index.html,表示访问主页。

9.从文件属性st判断是否有执行权限,若有,则cgi=1

10.若cgi=1(带参数 GET,POST 方式,url 为可执行文件),则执行cgi(execute_cgi)

11.读取整个 HTTP 请求并丢弃,如果是 POST 则找出 Content-Length. 把 HTTP 200 状态码写到套接字。

12.建立两个管道,cgi_inputcgi_output, 并 fork 一个进程。

13.在子进程中,把 STDOUT 重定向到 cgi_output 的写入端,把 STDIN 重定向到 cgi_input 的读取端,关闭 cgi_input 的写入端 和 cgi_output 的读取端,设置 request_method 的环境变量。GET 的话设置 query_string 的环境变量,POST 的话设置 content_length 的环境变量,这些环境变量都是为了给 cgi 脚本调用,接着用 execl 运行 cgi 程序。

14.在父进程中,关闭 cgi_input 的读取端 和 cgi_output 的写入端,如果 POST 的话,把 POST 数据写入 cgi_input,已被重定向到 STDIN,读取 cgi_output 的管道输出到客户端,该管道输入是 STDOUT。接着关闭所有管道,等待子进程结束。

猜你喜欢

转载自blog.csdn.net/jieyannn/article/details/104135633