网络基础——应用层

程序员所写的解决实际问题的网络程序,都是在应用层。

协议(是一种约定)

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的状态码

 类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer 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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值