【网络编程】|| 基于TCP实现的简单HTTP服务器

【1】Http协议报文

Http请求报文

请求报文格式第一行是请求行。
其中“GET”是请求方法,表示客户端以只读的方式来申请资源
常见的HTTP请求方法如下所示:

请求方法 含义
GET 申请获取资源,而不对服务器产生任何其他影响
HEAD 和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容
POST 客户端向服务器提交数据的方法。这种方法会影响服务器:服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源
PUT 上传某个资源
DELETE 删除某个资源
TRACE 要求目标服务器返回原始HTTP请求的内容,它可用来查看中间服务器(比如代理服务器)对HTTP请求的影响
OPTIONS 查看服务器对某个特定URL都支持哪些请求方法。也可以把URL设置为*,从而获得服务器支持的所有请求方法
CONNECT 用于某些代理服务器,它们能把请求的连接转化为个安全隧道
PATCH 对某个资源做部分修改

其中:HEAD、GET、OPTIONS和TRACE被视为安全的方法,因为它们只是从服务器获得资源或信息,而不对服务器进行任何修改
POST、PUT、DELETE和PATCH则影响服务器上的资源。

http://www.baidu.com/index.html 是目标资源的URL.
HTTP/1.0表示客户端使用的HTTP的版本号是1.0.
HTTP请求内容中的第2~4行都是HTTP请求的头部字段。一个HTTP请求可以包含多个头部字段。一个头部字段用行表示,包含字段名称、冒号、空格和字段的值。HTTP请求中的头部字段可按任意顺序排列。
User-Agent: WgeV1.12 linux gnu 表示客户端使用的程序是wget.
Host: www.baidu.com 表示目标主机名是 www.baidu.com. HTTP协议规定HTTP请求中必须包含的头部字段就是目标主机名。
Connection: close代表这个HTTP请求是长链接还是短链接,如果是短链接,则当本次请求完成后就断开连接,也就是说,同一个客户的多个连续的HTTP请求不能共用同个TCP连接;若是长连接,则在本次连接完成之后可以继续接收其他的连接,即多个HTTP请求可以共用一个TCP连接。

注意:在所有头部字段之后,HTTP 请求必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以\r\n结束(回车符和换行符):而空行则必须只包含一个\r\n,不能有其他字符,甚至是空白字符。

Http响应报文

在这里插入图片描述
第一行是状态行。
HTTP/1.0" 是服务器使用的HTTP协议的版本号。通常,服务器需要使用和客户端相同的HTTP协议版本。
200 OK 是状态码和状态信息。
常见的状态码和状态信息及其含义如下表所示

状态码 含义
200 OK (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
301 Moved Permanently (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 Found 通知客户端资源能在其他地方找到,但需要使用GET方法来获得它
304 Not Modified 表示被申请的资源没有更新,和之前获得的相同
400 Bad Request 通用客户请求错误
401 Unauthorized 请求需要认证信息
403 Forbidden 访问被服务器禁止,通常是由于客户端没有权限访问该资源
404 Not Found 资源没找到
500 Internal Server Error 通用服务器错误
503 Service Unavailable 暂时无法访问服务器

第2~7行是HTTP应答的头部字段。其表示方法与HTTP请求中的头部字段相同。
Server: BWS/1.0 表示目标Web服务器程序的名字是BWS ( Baidu Web Server).
Content-Length: 8024 表示目标文档的长度为8024字节。这个值和wget输出的文档长度致
Content-Type: text/html;charset =gbk 表示目标文档的MIME类型。其中“text”是主文档类型,“html" 是子文档类型。“text/html!" 表示目标文档index.html是text类型中的html文档。
charset" 是text文档类型的一个参数,用于指定文档的字符编码。

Set-Cookie 表示服务器传送个Cookie给客户端。其中,“BAIDUID”指定Cookie的名字,"expires” 指定Cookie的生存时间,“domain"和“path"指定该Cookie生效的城名和路径。

Via 表示在http应答在返回过程中经过的所有代理服务器的地址和名称。这个头部字段的功能有点类似于IP协议的记录路由功能。
注意:在所有头部字段之后,HTTP 应答必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以\r\n结束(回车符和换行符):而空行则必须只包含一个\r\n,不能有其他字符,甚至是空白字符。

【2】代码示例

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值