项目整体设计

18 篇文章 0 订阅

1. 项目背景

第一:为了强化学习的网络知识,将学习的网络知识应用到实际中。
第二:为了更加熟悉在浏览器中输入一个网址之后发生了什么。做了HTTP项目。
第三:可以在技术上理解我们上网,到关闭浏览器的过程。

2. 项目特点

  1. 网络编程(TCP/IP协议,socket编程,http协议基础知识)
  2. 多线程技术
  3. CGI技术
  4. shell编程
  5. MySQL C 应用程序接口(API)

3. CGI模式及技术

CGI模式及CGI程序

4. 项目流程

服务器端

1. 创建监听套接字

和其他的网络编程一样,首先需要创建监听套接字。socket函数创建套接字,bind绑定端口号。listen监听是否有客户端请求连接。一个简单的网络通道就建立好了。

2. 创建多线程

1.pthread_create创建多线程对客户端的请求进行处理。
2.此处需要注意的是创建的线程是需要等待的,否则会造成资源泄漏。
3.但是我们不能让主线程一直阻塞的等待新线程,主线程如果阻塞等待新线程,就不能做其他的工作了,不能对其他客户端的连接请求进行响应了。
4.在这里我们解决的方法是调用detach函数将新线程分离,分离的线程是不需要等待的。

3. 处理客户端请求

1.利用刚才创建的新线程处理客户端的请求。handler_request这个函数的功能就是处理客户端的请求。
2.我们要知道,我们要处理的是HTTP请求,而HTTP请求是基于请求响应的,在响应之前,我们必须将客户端的请求处理完毕。就像是听别人说话一样,我们在给别人回答之前,必须先把别人的话听完。
3.那么怎样处理客户端的请求呢?我们知道,HTTP请求分为三到四部分,请求报头以空行结尾。而每一部分都是以行为单位的。所以接下来我们要按行处理客户端请求报文了。
4.get_line函数的功能就是获取一行,在获取一行时,我们要碰到以\n,\r\n,\r,将这些换行符全转化为\n。函数recv从网卡中获取数据。
5.由于我们设计的HTTP只能处理get和post,接下来就是处理报文了。
我们要获取HTTP请求报文的请求行,得到我们的请求方法,URL,将URL分离为干净的URL和参数。
6.根据请求方法,是否带有参数决定是否用CGI模式。
post方法一定采用CGI方式运行。
get方法如果URL中只有/,拼接页面。
get方法如果有参数,采用CGI方式运行。
如果不是get和post方法,则返回404页面。

4.响应页面

1.在响应页面之前,我们需要将请求报头处理完成,但是报头中重要的信息就是请求行,在这之前,我们已经处理完成。接下来我们应该处理请求报文,因为请求报文中没有我们需要的内容,所以可以一行一行的读取并将它丢弃,知道读到空行为止。
2.报头处理完成,接下来就是响应页面了。在响应页面之前,我们需要将响应报头填充完成,响应报头最重要的是响应行,包括版本,状态码,状态。我们通过sprintf函数将每一行填充到line中,然后通过send函数发送出去。
3.在响应报头发送完成之后,就是响应页面了,响应页面我们需要将保存请求的资源的文件发送出去,这里有一个高大上的函数,sendfile 函数直接将文件拷贝到发送缓冲区中,然后发送出去。
注意这里只是针对get方法来说的

5. CGI模式
  1. 带参数的get方法和post方法都需要使用CGI方式运行。
  2. 我们这里的CGI方式是浏览器将请求发送给服务器,服务器(当前进程)发现请求行中有参数,或者是post方法,则创建子进程,将数据交给子进程,让子进程以CGI方式处理数据,在处理完数据后,将结果返回给父进程,父进程将结果返回给浏览器。
    这里写图片描述

  3. 一个问题:父进程在拿到请求方法和参数后,怎样将数据交给子进程呢?
    答: 有两种方法,第一种:通过环境变量传给子进程(环境变量可以被继承)。
    第二种:进程间通信,最简单的一种—管道。

  4. 在这里我们既采用环境变量的方式又采用管道方式。
  5. 首先利用环境变量将父进程的方法传给子进程,如果是get方法,再通过环境变量将参数传给子进程。如果是post方法,通过环境变量将正文长度(content_length)传过去。
  6. 然后创建两个管道,input和output。子进程通过input读,关闭写端;父进程通过output读,关闭写端,如下图:
    这里写图片描述
    父进程通过input[1]管道将post方法的参数传递给子进程。通过output[0]管道读取子进程的处理结果。
    子进程通过output[1] 管道将子进程的处理结果传递给父进程。通过input[0] 管道读取post的参数。
    注意: 1. 在子进程中,需要使用execl替换函数替换父进程的代码,让子进程运行CGI代码。 2. 为了解决输出输入重定向问题,我们使用dup2函数。dup2函数将标准输入和管道中的文件内容保持一致,在这种机制下,我们在CGI程序中直接从标准输入标准输出获取数据就可以了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值