代码整体思路
代码主体分为服务器端程序,客户端程序,以及一些CGI脚本
服务器端程序 (httpd.c)
- 服务器端初始化 包括(socket()创建套接字,bind()将地址和套接字绑定,listen()监听)
- 设置无限循环,循环内容:accept()接受来自客户端的请求,创建新的线程处理接收到的请求,线程创建失败跳出循环 (线程处理函数接下来说明)
- 关闭socket套接字,程序结束
客户端程序 (simpleclient.c)
- 客户端程序初始化 包括(socket()创建套接字,地址初始化,connect()和服务器端建立连接)
- 像普通文件操作一样,向服务器端发送数据,等待回复
- 收到回复后,打印接收到的数据,关闭套接字,程序结束
CGI脚本 (check.cgi, color.cgi)
- check.cgi
- color.cgi
html文件 (index.html)
创建了一个基本的网页,用来输入数据发送给服务器端
代码核心部分:服务器端的线程处理函数 (accept_request())
函数基本思路和实现
- 读取http请求第一行,读取函数:get_line()
- 确定http请求的方法 (如果是POST方法,将标志cgi置1)
- 将URL提取出来,如果是GET方法,将URL中?后的内容复制下来,并将cgi置1
- 处理路径,默认是访问index.html,如果文件不存在,就返回404状态码 (not_found()),如果文件是一个目录的话,就继续拼接路径,默认还是访问index.html,z再次判断文件是否具有可执行权限,如果有,cgi置1,表示调用CGI脚本
- 最后根据cgi的值判断,cgi == 0 调用静态文件(serve_file()),cgi == 1 调用cgi脚本(execute_file())
- 关闭套接字 close()