浅谈Tinyhttpd(解读tinyhttpd源代码)

代码整体思路

代码主体分为服务器端程序,客户端程序,以及一些CGI脚本

服务器端程序 (httpd.c)

  1. 服务器端初始化 包括(socket()创建套接字,bind()将地址和套接字绑定,listen()监听)
  2. 设置无限循环,循环内容:accept()接受来自客户端的请求,创建新的线程处理接收到的请求,线程创建失败跳出循环 (线程处理函数接下来说明)
  3. 关闭socket套接字,程序结束

客户端程序 (simpleclient.c)

  1. 客户端程序初始化 包括(socket()创建套接字,地址初始化,connect()和服务器端建立连接)
  2. 像普通文件操作一样,向服务器端发送数据,等待回复
  3. 收到回复后,打印接收到的数据,关闭套接字,程序结束

CGI脚本 (check.cgi, color.cgi)

  1. check.cgi
  2. color.cgi

html文件 (index.html)

创建了一个基本的网页,用来输入数据发送给服务器端

代码核心部分:服务器端的线程处理函数 (accept_request())

函数基本思路和实现

  1. 读取http请求第一行,读取函数:get_line()
  2. 确定http请求的方法 (如果是POST方法,将标志cgi置1)
  3. 将URL提取出来,如果是GET方法,将URL中?后的内容复制下来,并将cgi置1
  4. 处理路径,默认是访问index.html,如果文件不存在,就返回404状态码 (not_found()),如果文件是一个目录的话,就继续拼接路径,默认还是访问index.html,z再次判断文件是否具有可执行权限,如果有,cgi置1,表示调用CGI脚本
  5. 最后根据cgi的值判断,cgi == 0 调用静态文件(serve_file()),cgi == 1 调用cgi脚本(execute_file())
  6. 关闭套接字 close()
坚持原创技术分享,您的支持将鼓励我继续创作!