Web 服务器
欢迎访问我的另一个博客: https://xingzhu.top/
项目:https://xingzhu.top/archives/webfu-wu-qi-xiao-xiang-mu-linux-c-epoll
HTTP 协议
客户端 (浏览器):
- 通过浏览器地址栏给服务器发送请求,浏览器内部进行数据的封装
- 根据 http协议进行封装,封装完毕,数据发送给服务器
 
- 根据 
- 等待服务器的回复
- 收到服务器回复的数据,根据 http协议解析数据- 得到了服务器回复的原始数据
 
服务器端:
- 接收数据,被 http协议封装过的
- 根据 http协议解析数据,得到客户端请求的原始数据
- 处理客户端请求,得到处理结果
- 给客户端回复数据,(数据需要通过 http协议进行封装,然后在发送给客户端)
http协议封装好数据之后是一个数据块,得到若干行数据,使用的换行符\r\n
http 请求
http 请求消息分为四部分:
- 请求行;不管 get请求还是post请求,请求行是分为三部分
- 请求头
- 空行
- 客户端向服务器提交的数据
get 方式提交数据
- 如果使用 get的方式向服务器提交数据,数据并没有在请求协议的第四部分,而是在请求行的第二部分
- 如果使用 get方式提交数据,第四部分是空的 -> 用于为空
GET /pic/1.jpg HTTP/1.1
Host: 192.168.1.8:6789
Connection: keep-alive    # 一直保持连接
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0(Windows NT 10.0;Win64;x64)
AppleWebKit/537.36(KHTML, like Gecko)
Chrome/80.0.3987.186 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,imag
e/webp,image/apng,*/*;q=0.8,application/signed-
exchange;v=b3;q=0.9
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
-
- 第 14行为空行
- get请求:请求服务器上的静态文件,就是服务器上存在的文件
- /pic/1.jpg这个是请求的静态资源,注意这个- /是服务器的资源目录,不是服务器根目录,所以需要切换到指定的资源目录
- 请求头是若干个键值对,也就是上述从 2 到 8 行,冒号后面跟个空格再写数据
post 方式提交
POST / HTTP/1.1
Host: 192.168.1.8:6789
Connection: keep-alive
Content-Length: 98         # 提交的内容长度
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded       # 提交的数据格式 
User-Agent: Mozilla/5.0(Windows NT 10.0;Win64;x64)
AppleWebKit/537.36(KHTML,like Gecko)
Chrome/80.0.3987.106 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=8.9,ima
ge/webp,image/apng,*/*;q=0.8,application/signed-
exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
username=subwen%40gq.com&phone=1111111&email=sub%40gq.com
&date=2020-01-01&sex=male&class=1&rule=on
- 提交的数据是动态的,在服务器上不存在(如用户名和密码信息,是在对应的数据库上)
- 提交的数据在地址栏中不显示,但是 get方式提交会显示
http 响应
服务器给客户端回复数据,称之为 http 响应,协议的格式分为四部分:
- 状态行
- 消息报头/响应头
- 空行
- 回复给客户端的数据
http 响应消息也是一个数据块,若干行,换行 \r\n
HTTP/1.1 200 0k
Server: micro_httpd
Date: Fri, 18 Jul 2014 14:34:26 GMT
Content-Type: text/plain;charset=iso-8859-1(必选项)
Content-Length: 32
Location: https://www.biadu.com
Content-Language: zh-CN
Last-Modified: Fri,18 Jul 2014 08:36:36 GMT
Connection: close
#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}
http相应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种:
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作 (网络地址的重新访问)
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
- 200 OK客户端请求成功
- 400 Bad Request客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
- 403 Forbidden服务器收到请求,但是拒绝提供服务
- 404 Not Found请求资源不存在,如:输入了错误的 URL
- 500 Internal Server Error服务器发生不可预期的错误
- 503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常
详情查阅: 在线工具 —— OSCHINA.NET社区
相关操作函数
sscanf
// 函数原型
// 将参数 str 的字符串根据参数 format 字符串来转换并格式化数据,转换后
sscanf(const char *str, const char *format)
具体功能如下:
- 根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等
- 取指定长度的字符串
- 取到指定字符为止的字符串
- 取仅包含指定字符集的字符串
- 取到指定字符集为止的字符串
可以使用正则表达式进行字符串的拆分
正则匹配规则:
- [1-9]:匹配一个字符,这个字符在- 1-9范围内就满足条件
- [2-7]:匹配一个字符,这个字符在- 2-7范围内就满足条件
- [a-2]:匹配一个字符,这个字符在- a-z范围内就满足条件
- [A, b, c, D,e,f]:匹配一个字符,这个字符是集合中任意一个就满足条件
- [1-9,f-x]:匹配一个字符,这个字符是- 1-9,或者- f-x集合中的任意一个就满足条件
- [^1]:- ^代表否定,匹配一个字符,这个字符只要不是- 1就满足条件
- [^2-8]:匹配一个字符,这个字符只要不在- 2-8范围内就满足条件
- [^a-f]:匹配一个字符,这个字符只要不在- a-f范围内就满足条件
- [^ ]:匹配一个字符,这个字符只要不是空格就满足条件
const char *s = "http://www.baidu.com:1234";
char protocol[32] = {0};
char host[128] = {0};
char port[8] = {0};
sscanf(s, "%[^:]://%[^:]:%[1-9]", protocol, host, port);
说明:参考学习 https://subingwen.cn/

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号