程序员所写的解决实际问题的网络程序,都是在应用层。
协议(是一种约定)
socket api的接口,在读写数据时,都是按“字符串”的方式来发送接收的
1、网络版计算器
2、HTTP协议(超文本传输协议)
虽然应用层的程序是程序员自己定义的,但已经有很多大佬定义了一些现成的,有很好用的应用层协议,供我们参考使用。
(1)认识URL(网址)
想?/:等这样的字符已经被特殊意义理解,不能随意出现
如果需要这样的字符,就必须是将其转义后在出现
转义的规则:将需要转码的字符转为16进制,然后从左到右,取4位(不足4位直接处理),每2位做1位,前面加上%,编码称%XY格式
(2)HTTP协议格式
HTTP请求
HTTP响应
HTTP的方法
方法 | 说明 | 支持的HTTP协议的版本 |
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.0 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
最常用的是GET方法和POST方法
HTTP的状态码
类别 | 原因短语 | |
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务端错误状态码) | 服务器处理请求出错 |
HTTP常见Heade
·Content-Type:数据类型(text/html)等
·Content-Length:Body的长度
·Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
·User-Agent:声明用户的操作系统和浏览器版本信息
·referer:当前页面是从哪个页面跳转过来的
·location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问
·Cookie:用于在客户端存储少量信息。通常用于实现会话(session)的功能
实现一个最简单的服务器,只在网页上输出“hello world”(按照HTTP协议的要求构造函数)
1 #include<sys/socket.h>
2 #include<netinet/in.h>
3 #include<arpa/inet.h>
4 #include<unistd.h>
5 #include<stdio.h>
6 #include<string.h>
7 #include<stdlib.h>
8
9 void Usage()
10 {
11 printf("usage: ,./server [ip][port]\n");
12 }
13 int main(int argc,char* argv[])
14 {
15 if(argc != 3){
16 Usage();
17 return 1;
18 }
19 int fd = socket(AF_INET,SOCK_STREAM,0);
20 if(fd < 0){
21 perror("socket");
22 return 1;
23 }
24 struct sockaddr_in addr;
25 addr.sin_family = AF_INET;
26 addr.sin_addr.s_addr = inet_addr(argv[1]);
27 addr.sin_port = htons(atoi(argv[2]));
28
29 int ret = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
30 if(ret < 0){
31 perror("bind");
32 return 1;
33 }
34 ret = listen(fd,10);
35 if(ret < 0){
36 perror("listen");
37 return 1;
38 }
39
40 for(;;){
41 struct sockaddr_in client_addr;
42 socklen_t len;
43 int client_fd = accept(fd,(struct sockaddr*)&client_addr,&len);
44 if(client_fd < 0){
45 perror("accept");
46 continue;
47 }
48 char input_buf[1024 * 10] = {0};
49 ssize_t read_size = read(client_fd,input_buf,sizeof(input_buf) - 1);
50 if(read_size < 0){
51 return 1;
52 }
53 printf("[Request] %s",input_buf);
54 char buf[1024] = {0};
55 const char* hello = "<h1>hello world</h1>";
56 sprintf(buf,"HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s",strlen(hello),hello);
57 write(client_fd,buf,strlen(buf));
58 }
59 return 0;
60 }