【HTTP协议与Web服务器】

news2024/11/28 3:28:50

HTTP协议与Web服务器

  • 浏览器与服务器通信过程
  • HTTP的请求报头
    • HTTP请求报头结构
    • HTTP的请求方法
  • HTTP应答报头
    • HTTP应答报头结构
    • 应答状态
  • web服务器的c语言实现

浏览器与服务器通信过程

浏览器与Web服务器再应用层通信使用的是HTTP协议,而HTTP协议在传输层使用的是TCP协议。那么浏览器需要和web服务器进行三次握手建立连接之后才能发送HTTP请求报文,服务器收到请求保温,向浏览器回复HTTP应答报文。在发起连接之前需要得到服务器的IP以及端口。用户在浏览器中输入网址,浏览器会通过DNS服务查询获取到服务器的IP地址。对于端口来讲,使用HTTP协议的程序一般默认使用80端口。
浏览器服务器建立连接之后,如果两次以上的请求复用同一个TCP连接,则称之为长连接。如果浏览器发送一次请求报文,服务器回复一次应答就断开连接,下次交互重新进行三次握手建立连接,这种称之为短连接。现如今大多数为长连接,可以减少网络中的同步报文,也使得服务器的响应速度变快。

HTTP的请求报头

HTTP请求报头结构

GET/index.html HTTP/1.0\r\n 请求方法 请求页面 协议版本
User-Agent:Wget/1.12\r\n 客户端应用程序
Host:192.168.141.128\r\n 目标主机
Connection:close\r\n 连接方式(close/keep-alive)
在这里插入图片描述

HTTP的请求方法

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

HTTP应答报头

HTTP应答报头结构

在这里插入图片描述

应答状态

状态码和状态信息含义
100 Continue服务器收到了客户端的请求行和头部信息,告诉客户端继续发送数据部分,客户端通常要先发送Expect:100-continue 头部字段告诉服务器自己还有数据要发送
200 OK请求成功
400 Bad Request通用客户请求错误
403 Forbidden访问被服务器禁止,通常是由于客户端没有权限访问该资源
404 Not Found资源没找到

web服务器的c语言实现

Web 服务器对应的文件是 myHttp.c,代码示例如下, 其中使用到的页面文件(.html)需要
用户自己提供,并且和程序在同一个位置:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <fcntl.h>

#define  PATH       "/home/xin/kd1"
#define  DFL_FILENAME "/index.html"//默认路径
struct mess
{
    int fd;
};

int socket_init();

char* get_filename(char http_req[])//获取该主机的所申请文件的路径
{
    if ( http_req == NULL )
    {
        return NULL;
    }

    char * ptr = NULL;
    char* s = strtok_r(http_req," ",&ptr);
    if ( s == NULL )
    {
        return NULL;
    }

    printf("客户端请求方法:%s\n",s);
    s = strtok_r(NULL," ",&ptr);
    return s;
}

//struct mess节点的地址传入
void* fun(void * arg)
{
    struct mess * p = (struct mess*)arg;
    int c = p->fd;
    free(p);

    char http_req[512] = {0};
    int num = recv(c,http_req,512,0);
    if ( num <= 0 )
    {
        close(c);
        pthread_exit(NULL);
    }

    printf("浏览器发送的请求报文:\n%s\n",http_req);

    char* filename = get_filename(http_req);
    if ( filename == NULL )
    {
        //回复404
        close(c);
        pthread_exit(NULL);
    }

    char path[256] = {PATH};
    if ( strcmp(filename,"/") == 0 )
    {
        strcat(path,DFL_FILENAME);
    }
    else
    {
        strcat(path,filename);
    }

    printf("open:%s\n",path);
    //打开文件
    int fd = open(path,O_RDONLY);
    if ( fd == -1 )
    {
        //错误回复 404
        printf("打开失败\n");
        close(c);
        pthread_exit(NULL);
    }

    int filesize = lseek(fd,0,SEEK_END);//计算文件大小
    lseek(fd,0,SEEK_SET);
    //组装报文
    char http_res[512] = {0};
    strcpy(http_res,"HTTP/1.0 200 OK\r\n");
    strcat(http_res,"Server: myhttp\r\n");
    sprintf(http_res+strlen(http_res),"Content-Length: %d\r\n",filesize);
    strcat(http_res,"\r\n");
    send(c,http_res,strlen(http_res),0);
    printf("发送应答头部:%s\n",http_res);
    
    char data[1024] = {0};
    int m = 0;
    while( (m = read(fd,data,1024)) > 0 )
    {
        send(c,data,m,0);
    }
    close(fd);
    close(c);
}
int main()
{
    int sockfd = socket_init();
    if ( sockfd == -1 )
    {
        printf("socket init err\n");
        exit(0);
    }
   
   while( 1 )
   {
       struct sockaddr_in caddr;
       int len = sizeof(caddr);
       int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
       if ( c < 0 )
       {
           continue;
       }

       struct mess * p = (struct mess*)malloc(sizeof(struct mess));
       pthread_t id;
       p->fd = c;
       pthread_create(&id,NULL,fun,(void*)p);
   } 
}

int socket_init()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if ( sockfd == -1 )
    {
        return -1;
    }

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(80);//浏览器http端口
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if ( res == -1 )
    {
        return -1;
    }

    res = listen(sockfd,30);
    if ( res == -1 )
    {
        return -1;
    }

    return sockfd;
}

index.html:
在这里插入图片描述
服务器连接结果:在这里插入图片描述
此处正常解析文件需要时html文档,如果是其他文档运行则结果会因为无法解析出现文件直接下载或直接打印在网页上(不同浏览器可能出现状况不一样)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化

在深度学习中&#xff0c;第一步要做的往往就是处理数据集,尤其是学习百度飞桨PaddlePaddle的小伙伴&#xff0c;数据集经常要用Voc格式的&#xff0c;比如性能突出的ppyolo等模型。所以学会数据集转化的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化&…

数据库系统概论

文章目录前言基础篇&#xff1a;1-5章第 1 章 绪论1.1 数据库系统概述1.2 数据模型1.3 数据库系统的结构1.4 数据库系统的组成1.5 小结第 2 章 关系数据库1.关系模型1.1 关系数据结构1.2 关系完整性约束实体完整性、参照完整性、用户定义完整性2.关系代数8种关系代数运算符并 ∪…

「媒体邀约」如何选择适合的媒体公关,媒体服务供应商

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 每天胡老师也会接到大量关于媒体方面的询问&#xff0c;胡老师也都一一的很耐心的进行了解答&#xff0c;也都很详细的做了媒体规划和媒体传播方案&#xff0c;但有的朋友还是很犹豫&…

关于 @Aspect 注解的使用

一、Spring AOPAOP(Aspect Oriented Programming) 是一种面向切面的编程思想。面向切面编程是将程序抽象成各个切面&#xff0c;即解剖对象的内部&#xff0c;将那些影响了多个类的公共行为抽取到一个可重用模块里&#xff0c;减少系统的重复代码&#xff0c;降低模块间的耦合度…

Hive小结

Hive的定义hive是一个建立在Hadoop上的开源数据仓库软件&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为hive查询语言&#xff08;HQL&#xff09;&#xff0c;用于访问和分析存储在Hadoop文件中的大型数…

Uipath Excel 自动化系列12-InsertDeleteSheet(新增删除Sheet)

活动描述 Insert Sheet 新增Sheet:在 Excel 文件中插入工作表,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 Delete Sheet 删除Sheet:从 Excel 文件中删除指定工作表,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; Inser…

【React教程】一、React简介

一、React简介 React是一个用于构建用户界面的JavaScript库&#xff0c;它是Facebook的内部项目&#xff0c;用来架设Instagram的网站,并于2013年5月开源。React主要用于构建Ul&#xff0c;很多人认为React 是 MVC 中的 V&#xff08;视图&#xff09;。由于拥有较高的性能&…

计算机组成原理——计算机系统概述

文章目录计算机系统的组成计算机硬件冯诺依曼结构计算机的功能部件计算机软件系统软件和应用软件三个级别的语言计算机的性能指标字长数据通路宽度主存容量运算速度计算机系统的组成 计算机系统由硬件系统和软件系统组成&#xff1a; 硬件是指有形的物理设备&#xff0c;是计…

【CICD】如何编写 .gitlab-ci.yml 文件

⏳ CICD 指的是持续集成/持续交付&#xff08;continuous integration/ continuous delivery&#xff09;&#xff0c;是为了满足互联网、金融公司快速迭代项目的需要而提出的一种软件开发思想。大致思路是通过编写自动化脚本&#xff0c;使新代码必须通过一些规则核查后才能部…

自定义控件(?/N) - 事件分发

一、外部传递到ViewGroup中Activity会通过 getWindow( ) 获取PhoneWindow对象并调用它的superDispatchTouchEvent( )&#xff0c;该方法会调用它&#xff08;PhoneWindow&#xff09;的内部类 DecorView 的 superDispatchTouchEvent( )&#xff0c;而它&#xff08;DecorView&a…

【Docker】P1 初识 Docker 以及 Ubuntu 安装 Docker

初识 Docker 以及 Ubuntu 安装 Docker初识 Docker故事引入DockerUbuntu 安装 Docker读完本文&#xff0c;你应当会理解这两句话&#xff1a; Docker 可以大大简化运维部署相关操作&#xff0c;可以规避一些 bug&#xff1b; Docker 是一种容器技术&#xff0c;解决软件跨环境迁…

使用Houdini输出四面体网格并输出tetgen格式

我们的目标是从houdini输出生成的四面体&#xff0c;希望是tetgen格式的。 众所周知&#xff0c;houdini是不能直接输出四面体的。 有三方案去解决&#xff1a; 输出点云ply文件&#xff0c;然后利用tetgen生成网格。输出Hounidi内置的.geo格式文件&#xff0c;然后写个脚本…

[Java Web]Request对象 | 超1w字带你熟悉Servlet中的request请求

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601; 目录 Reque…

Codeforces Round 857 (Div. 2)【A-C】

文章目录A. Likes【贪心、模拟】B. Settlement of Guinea Pigs【贪心】C. The Very Beautiful Blanket【构造、观察】链接传送门A. Likes【贪心、模拟】 分析 为了使得当前时间点赞的尽可能大&#xff0c;那么前面的赞的数目也要尽可能大&#xff0c;所以前面把能赞的都要先赞…

2-8 SpringCloud快速开发入门: Eureka 服务注册中心自我保护机制

接上一章节Eureka 注册中心高可用集群搭建&#xff0c;这里讲讲Eureka 服务注册中心自我保护机制 Eureka 服务注册中心自我保护机制 自我保护机制是 Eureka 注册中心的重要特性&#xff0c;当 Eureka 注册中心进入自我保护模式时&#xff0c;在 Eureka Server 首页会输出如下警…

Python JS逆向篇(一)

Python JS逆向篇&#xff08;一&#xff09;效果实现思路最后一步逆向 p.a.HmacSHA256(t, s["a"].state.commonStore.cupid_sign_key)JS实现py实现&#xff08;先苦后甜&#xff09;逆向主题&#xff1a;51job请求头headers中携带的sign参数。 &#xff08;注&#x…

Windows基于Nginx搭建RTMP流媒体服务器(附带所有组件下载地址及验证方法)

RTMP服务时常用于直播时提供拉流推流传输数据的一种服务。前段时间由于朋友想搭建一套直播时提供稳定数据传输的服务器&#xff0c;所以就研究了一下如何搭建及使用。 1、下载nginx 首先我们要知道一般nginx不能直接配置rtmp服务&#xff0c;在Windows系统上需要特殊nginx版本…

centos8 安装 pcs pacemaker

一、背景 在centos-8中安装pcs、pacemaker会显示找不到源 &#xff08;yum install pcs pacemaker 也是一样的&#xff09; 通过搜索引擎&#xff0c;有说&#xff1a;dnf config-manager --set-enable HighAvailability 也有的说&#xff1a;执行dnf update 也有的说执行 dn…

AB测试——流程介绍(设计实验)

前言&#xff1a; 作为AB测试的学习记录&#xff0c;接上文内容&#xff0c; 本文继续介绍假设建立和实验设计部分&#xff0c;包括实验对象、样本量计算&#xff08;显著性水平、统计功效及最小可检测效应&#xff09;、实验周期。 相关文章&#xff1a; AB测试——原理介绍 A…

【PyTorch】教程:torch.nn.PReLU

torch.nn.PReLU 原型 CLASS torch.nn.PReLU(num_parameters1, init0.25, deviceNone, dtypeNone) 参数 num_parameters ([int]) – 需要学习的 aaa 的数量&#xff0c;尽管作为输入&#xff0c;只有两个值是合法的&#xff0c;1 或者 输入的通道数&#xff0c;默认为 1 。ini…