学习记录——day33 HTTP

目录

一、HTTP相关概念

二、客服端请求

1、请求首部

2、 响应首部

三、线程实现HTTP并发服务器


一、HTTP相关概念

1、HTTP,全称Hyper Text Transfer Protocol,用于万维网(world wide web)进行超文本学习的传输协议

2、HTTP属于应用层,对应的传输层是TCP

3、http是基于BS模型,即浏览器服务器模型,主要完成的是客户端请求端和服务器相应端

4、Hypertext Markup Language 超文本标记语言,属于标签式语言,能够被浏览器所识别

二、客服端请求

1、请求首部

1)任何一个http请求都由三部分组成:请求首部、请求主体、请求数据

2)对于客户端请求协议包而言,一般没有请求数据,具体格式如下

 

2、 响应首部

1)响应首部也是由三部分组成,分别是响应头、响应主体、响应数据

2)对于响应首部而言,必须由响应数据

3)http的响应代号:1XX (信息状态错误) 2XX(成功) 、3XX(重定向状态码)、4XX(客户端错误)、5XX(服务器出错) 

三、线程实现HTTP并发服务器

有BUG

#include <myhead.h>
#define SER_PORT 80
#define SER_IP "192.168.0.106"void do_notfound(int newfd);
void do_response(int newsfd, const char *url);
int send_head(int newfd, int file_size);
void send_html(int newfd, int fd);
void do_server_error(int newfd);
int get_one_line(int newfd, char msg[]);// 线程用信息初传输结构体
struct Info
{struct sockaddr_in cin;int newsfd;
};// 线程处理函数
void *deal_cli_msg(void *arg)
{int newsfd = ((struct Info *)arg)->newsfd;struct sockaddr_in cin = ((struct Info *)arg)->cin;while (1){// 5、数据收发char buf[128] = "";// 获取请求头部get_one_line(newsfd, buf);// 获取请求方法char mathod[5] = "";              // 存储请求方法strcpy(mathod, strtok(buf, " ")); // 分割字符串并将分割下来的第一个字符串存入mathodchar url[50] = "";char n_url[256] = "";strcpy(url, strtok(NULL, " ")); // 在上一次分割的基础上,将第二个字符串存入urlif (strcmp(mathod, "GET") == 0){// 完成相应工作// 重组urlsnprintf(n_url, sizeof(n_url), "./htmls%s", url);// 判断要访问的文件是否存在if (access(n_url, F_OK) == -1){// 返回错误信息do_notfound(newsfd);break;}else{// 响应do_response(newsfd, n_url);}}else{// 非法请求// do_illigal(newsfd);}}pthread_exit(EXIT_SUCCESS);
}int get_one_line(int newfd, char msg[])
{char buf = '\0';int i = 0;while (1){int res = recv(newfd, &buf, 1, 0);if (0 == res){break;}else if (1 == res){if (buf == '\n'){break;}else{msg[i] = buf;i++;}}else{perror("recv error");return -1;}}msg[i] = '\0';
}// 响应函数
void do_response(int newsfd, const char *url)
{// 1、以只读的形式打开文件int fd = open(url, O_RDONLY);if (-1 == fd){/* 服务器内部错误 */do_server_error(newsfd);return;}// 2、获取文件大的长度int file_size = lseek(fd, 0, SEEK_END);// 3、封装响应头部发送给客服端int res = send_head(newsfd, file_size);if (0 == res){return;}// 4、发送html文档给客服端lseek(fd, 0, SEEK_SET);// send_html(newfd,fd);printf("响应成功\n");close(fd); // 关闭文件
}// 头部发送函数
int send_head(int newfd, int file_size)
{char *head = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n";char n_head[512] = "";snprintf(n_head, sizeof(n_head), "%sContent-Length:%d\r\n\r\n", head, file_size);printf("n_head = %s\n", n_head);// 将头部发送个客服端int res = send(newfd, n_head, strlen(n_head), 0);return res;
}// 发送文件函数
void send_html(int newfd, int fd)
{char buf[128] = "";while (1){/* 从文件中读取数据 */int res = read(fd, buf, sizeof(buf));if (-1 == res){/* 服务器内部出错 */do_server_error(newfd);return;}else if (0 == res){/* 读取结束 */break;}// 将数据发送给客服端send(newfd, buf, res, 0);}
}// 服务器内部出错
void do_server_error(int newfd)
{char *msg = "HTTP/1.1 502 SERVER_ERROR\r\nContrnt-Type-text/html\r\n";// 向客服端发送错误信息send(newfd, msg, strlen(msg), 0);// 定义要发送的数据char *msg_html = "<!DOCTYPE html>\n\
<html lang=\" en \">\n\
<head>\n\<meta charset=\" UTF -\8 \">\n\<meta name=\" viewport \" content=\" width = device - width,\initial - scale = 1.0 \">\n\<title>502 SERVER_ERROR</title>\n\
</head>\n\
<body>\n\<h1>服务器内部出错</h1>\n\<p>文件描述符打开出错</p>\n\
</body>\n\
</html>";send(newfd, msg_html, strlen(msg_html), 0);
}// 对象访问界面不存在
void do_notfound(int newfd)
{char *msg = "";// 向客服端发送错误信息send(newfd, msg, strlen(msg), 0);// 定义要发送的数据char *msg_html = "HTTP/1.1 404 NOT_FOUND\r\nContrnt-Type-text/html\r\n\< !DOCTYPE html >\n<html lang = \" en \">\n<head>\n < meta charset = \" UTF -8 \">\n\<meta name=\" viewport \" content=\" width = device - width,initial - scale = 1.0 \">\n\<title>502 SERVER_ERROR</title>\n\
</head>\n\
<body>\n\<h1>404 NOT_FOUND</h1>\n\<p>e界面不存在</p>\n\
</body>\n\
</html>";
}int main(int argc, char const *argv[])
{// 1、创建套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);// 参数1:ipv4的网络通信// 参数2:TCP通信方式// 参数3:默认使用一个协议if (sfd == -1){perror("socket error");return -1;}printf("socket success, sfd = %d\n", sfd); // 3// 2、为套接字绑定ip地址和端口号// 2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // ip地址// 2.2 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、将套接字设置为被动监听状态,用于接收if (listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");// 4、阻塞等待客户端的连接请求// 4.1 定义n变量用于e接收客服端的信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);while (1) // 循环服务器{// 4.2 接收连接int newsfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);if (newsfd == -1){perror("accept error");return -1;}printf("[%s:%d]:accept on\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));struct Info cli_info = {cin,newsfd};// 创建分支线程用于处理客服端请求pthread_t tid = -1;if (pthread_create(&tid, NULL, deal_cli_msg, &cli_info) != 0){/* 出错 */printf("tid create error");return -1;}//将线程设置为n分离态pthread_detach(tid);}close(sfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406022.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算xpclr

1.conda安装xpclr 首先安装流程很轻松 conda create -n xpclr -c bioconda xpclr conda activate xpclr xpclr -h 2.按照要求准备文件 XPCLR - 简书 (jianshu.com) 根据教程准备文件&#xff0c;vcf&#xff0c;计算好的map&#xff0c;以及样本文件txt 其实官网也有介绍…

Docker基础概述、Docker安装、Docker镜像加速、Docker镜像指令

1.为什么学docker 开发环境与测试环境不同&#xff0c;导致错误 因此docker提供解决方法———系统平滑移植&#xff0c;容器虚拟化技术 将代码与软件与配置文件 打包成一个镜像 2.docker的历练 创建一个开发环境内成为镜像文件再用docker使用镜像 3.什么是docker Docke…

MySQL5.7数据库---入门教程(小白教程)

一、MySQL安装 本文以MySQL5.7安装为例。在设置完root密码和添加一个用户后&#xff0c;一路默认。 1、 2、通过点击红圈里的箭头选择对应的版本。 3、 4、端口&#xff08;Port&#xff09;一般默认不需要更改。 5、 二、配置环境变量 配置环境变量可以方便在win系统中cmd…

流媒体服务器二 3学习 librtmp 库的配置使用

librtmp 库是个啥&#xff1f; librtmp是一个开源的基于C语言的库&#xff0c;提供了一个连接RTMP服务器&#xff0c;发送和接收RTMP流的API。 它可以用来开发流媒体播放器&#xff0c;网络直播等应用。它的主要特点是快速、稳定和低延迟。 librtmp支持RTMP&#xff0c;RTMPS…

Qt第十七章 多线程

文章目录 多线程1. 线程概念的起源2. 三种方式创建线程3. 启动线程前的准备工作4. 启动线程/退出线程5. 操作运行中的线程6. 为每个线程提供独立数据7.子线程不能操作ui解决方案 多线程 1. 线程概念的起源 单核CPU 早期还没有线程的概念&#xff0c;如何保证2个进程同时进行呢…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容&#xff0c;微博用户主页内容以及导出爬取到的微博数据等操作&#xff0c;那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

(转载)使用zed相机录制视频

参照下面这个链接 https://blog.csdn.net/peng_258/article/details/127457199?ops_request_misc&request_id&biz_id102&utm_termzed2%E5%BD%95%E5%88%B6%E6%95%B0%E6%8D%AE%E9%9B%86&utm_mediumdistribute.pc_search_result.none-task-blog-2~all~sobaiduweb…

代码复现改进

代码复现&#xff0c;文献复现&#xff0c;文章复现&#xff0c; 算法复现&#xff0c;科研复现 Matlab,Python中英文均可 保证质量&#xff0c;加快你的研究速度 代码改进跑通&#xff0c;模型优化改进

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;是一种新型的元启发式算法&#xff0c;它于2024年4月由Youfa Fu等人提出&#xff0c;并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…

uniapp h5手机如何打开本地跑的前端项目进行本地调试

本地调试使用 vConsole是一个轻量级的移动端调试工具&#xff0c;可以在iOS设备上直接调试Uniapp H5应用。下面是具体的步骤&#xff1a; 在Uniapp项目中安装vConsole依赖&#xff1a;npm install vconsole。 在项目的main.js文件中引入vConsole库&#xff1a;import VConso…

将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解

1.首先,你将你的iso的文件按照正常的流程和需求安装到你的虚拟机中,我这里使用的是vmware,安装完成之后,关机。再次点开你安装好的那台虚拟机的窗口,如下图 选中要导出的镜像,镜像需要关机 2.点击工具栏的文件------选择 导出 整个工程到 ovf 格式—这里你可以选择你要导…

思科设备静态路由实验

拓扑及需求 网络拓扑及 IP 编址如图所示&#xff1b;PC1 及 PC2 使用路由器模拟&#xff1b;在 R1、R2、R3 上配置静态路由&#xff0c;保证全网可达&#xff1b;在 R1、R3 上删掉上一步配置的静态路由&#xff0c;改用默认路由&#xff0c;仍然要求全网可达。 各设备具体配置…

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

【数模修炼之旅】05 拟合模型 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 拟合模型介绍及应用 …

C++ | Leetcode C++题解之第357题统计各位数字都不同的数字个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countNumbersWithUniqueDigits(int n) {if (n 0) {return 1;}if (n 1) {return 10;}int ans 10, cur 9;for (int i 0; i < n - 1; i) {cur * 9 - i;ans cur;}return ans;} };

91.WEB渗透测试-信息收集-Google语法(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;90.WEB渗透测试-信息收集-Google语法&#xff08;4&#xff09; 怎样判断哪些漏洞有什么样…

数据结构——顺序栈和链式栈

目录 引言 栈的定义 栈的分类 栈的功能 栈的声明 1.顺序栈 2.链式栈 栈的功能实现 1.栈的初始化 (1)顺序栈 (2)链式栈 (3)复杂度分析 2.判断栈是否为空 (1)顺序栈 (2)链式栈 (3)复杂度分析 3.返回栈顶元素 (1)顺序栈 (2)链式栈 (3)复杂度分析 4.返回栈的大…

怎么管控终端电脑上的移动端口

管控终端电脑上的移动端口&#xff0c;尤其是USB等移动端口&#xff0c;是确保企业数据安全和提升网络管理效率的重要手段。 一、使用注册表编辑器禁用USB端口&#xff08;适用于Windows系统&#xff09; 打开注册表编辑器&#xff1a; 同时按下“WinR”组合键&#xff0c;打…

IPD产品开发流程详细活动图及说明

1、概念阶段 完整见文章后 2、计划阶段 篇幅有限&#xff0c;获取完整阶段活动图以及步骤说明&#xff0c;见下图

【UE5】Groom毛发系统的基本使用——给小白人添加头发

目录 效果 步骤 一、准备 二、使用3DsMax制作毛发 三、在UE中给小白人安装毛发 四、修改毛发材质 效果 步骤 一、准备 1. 新建一个第三人称模板工程 2. 在项目设置中&#xff0c;勾选“支持计算蒙皮缓存” 3. 在插件面板中&#xff0c;启用“Groom”和“Alembic Gro…