HTTP服务器(二)

2023-11-06

前面已经实现了服务器的整体框架,现在就来具体实现HTTP服务器处理静态页面的逻辑。

要获取具体的静态文件,就要知道要获取的文件的路径。我们分析url:

协议方案名:使用http:或https:等协议方案名获取访问资源时要指定的协议类型

登录信息:用户名和密码作为从服务器端获取的必要登录信息,是可选项

服务器地址:访问服务器的地址(可以是要进行解析的地址,也可以是IPv4地址)

服务器端口号:指定服务器连接的网络端口号,同样是可选项(默认是80端口)

带层次的文件路径:指定服务器上的文件路径来定位特定的资源

查询字符串:针对已指定文件路径内的资源,可以传入 查询字符串的相关参数

片段标识符:通常可以出已获取资源中的子资源

我们访问服务器的方式是通过IP地址和端口号访问,如果访问某个静态资源,就在IP地址和端口号后面带上文件的路径。我们建立一个目录作为服务器的根目录。

于是我们就可以通过url分析出要访问文件的路径;然后就可以做出响应了。

  • 根据url获取到真实的文件路径

先将url路径转化为服务器工作目录下的路径,然后:

如果url没有路径,默认为根目录,尝试访问根目录下的默认文件index.html

如果url是一个目录,尝试访问index.html

如果url不是目录,也就是说是一个文件,什么都不用做

int HandlerFilePath(char url_path[], char* file_path)
{
    sprintf(file_path, "./wwwroot%s", url_path);
    if(strcmp(url_path, "/") == 0)
    {
        strcat(file_path, "index.html");
    }
    else if(IsDir(file_path))
    {
        strcat(file_path, "index.html");
    }                                                                                                                                
    else;
    return 200;
}
  • 构造响应报文

要构造出浏览器可以正确解析的报文,就要学习HTTP协议中的响应报文格式:

HTTP响应报文格式:

首           行:版本号  状态码  状态码解释

header部分:请求的属性,以冒号为分隔的键值对;每组属性之间用\n分隔

空           行:表示header部分结束

body  部  分:空行后面的内容,如果存在,属性中一定有一个Content-Length字段来标识body部分的长度

根据响应报文格式构造响应报文:

int HandlerStaticFile(int sock, Req* req)
{
    //获取到文件路径
    char file_path[1024*4] = {0};                                                                                                    
    int err_code = HandlerFilePath(req->url_path, file_path);
    printf("%s\n", file_path);
    //打开文件,读取文件内容,写到socket中
    int fd = open(file_path, O_RDONLY);
    const char* first_line = "HTTP/1.1 200 OK\n";
    const char* blank_line = "\n";
    struct stat st ;
    stat(file_path, &st);
    int file_size = st.st_size;
    char header[1024*4] = {0};
    sprintf(header, "Content-Length: %u\n", file_size);
    send(sock, first_line, strlen(first_line), 0);
    send(sock, header, strlen(header), 0);
    send(sock, blank_line, strlen(blank_line), 0);                                                                                   
    sendfile(sock, fd, NULL, file_size);
    close(fd);
    printf("handlerstatic ok\n");
    return err_code;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP服务器(二) 的相关文章

随机推荐

  • vue脚手架中创建自定义指令

    局部自定义指令直接在组件内部创建
  • 使用tee命令 将bash -x 输出的内容保存到文件中

    tee 命令语法 tee ai help version 文件 参数 a或 append 附加到既有文件的后面 而非覆盖它 i或 ignore interrupts 忽略中断信号 help 在线帮助 version 显示版本信息 示例 ba
  • java -jar 启动脚本

    ccue sh 需 chomd x ccue sh 启动使用 ccue sh start bin sh ccue sh start 启动 stop 停止 restart 重启 status 状态 AppName ccue server ja
  • 【一分钟解决】Python报错ImportError: attempted relative import with no known parent package

    文章目录 报错关键词 常见问题汇总及排查 1 在脚本中使用相对导入 详细解决方案 1 看这段基本够了 使用相对导入的时机 2 扩展 如果你真的需要在包平级目录以外的位置调用包 参考链接 扩展 名词解释 脚本 script 模块 module
  • 【Python 3.7】分子运动:修改 rw_visual.py,将其中的 plt.scatter() 替换为 plt.plot() 。为 模拟花粉在水滴表面的运动路径

    Python 3 7 分子运动 修改 rw visual py 将其中的 plt scatter 替换为 plt plot 为 模拟花粉在水滴表面的运动路径 向 plt plot 传递 rw x values 和 rw y values 并
  • 前端canvas绘制水波球

    效果如下图 代码
  • 创建软链接(symbolic link)

    Linux ln命令是一个非常重要命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 类似windows下的快捷方式 Linux文件系统中 有所谓的链接 link 我们可以将其视为档案的别名 而链接又可分为两种 硬链接 hard
  • 计算机视觉学习总结:基本的图像操作和处理(一)

    PIL Python图像处理类库 PIL Python Imaging Library Python 图像处理类库 提供了通用的图像处理功能 以及大量有用的基本图像操作 比如图像缩放 裁剪 旋转 颜色转换等 基本操作 1 读取图片及灰度转换
  • acwing模板整理(第一讲)(基础算法)

    目录 一 归并排序模板 二 二分 需要满足单调性 整数二分和小数二分 三 高精度加减乘除 2 减法 3 乘法 4 除法 四 1 一维前缀和与差分数组 2 子矩阵的前缀和与差分矩阵 二维前缀和与二维差分矩阵 五 双指针算法 找单调性优化 双指
  • 测试——Web网站测试主要测试那些内容

    一般的网站的主要测试内容就分为以下几点 目录 功能测试 性能测试 安全测试 稳定测试 兼容性测试 压力测试 功能测试 功能测试常用到的有效方法 等价划分法 等价划分法就是把输入空间划分为几个 等价区间 在每个等价区间中只需要测试一个典型的数
  • 六、代理模式

    六 动态代理模式 1 模式结构和结构图 1 抽象主题 Subject 类 通过接口或抽象类声明真实主题和代理对象实现的业务方法 1 2 真实主题 Real Subject 类 实现了抽象主题中的具体业务 是代理对象所代表的真实对象 是最终要
  • Linux Power Supply架构及代码解析

    一 概述 电源管理整体上可以分为两个部分 一个是电池监控 fuel gauge 另外一个是充放电管理 这两部分在内核中也是分为两个驱动来管理 fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等 同
  • redis学习总结

    文章目录 redis数据结构原理 简单字符串SDS 叫Simple dynamic string 链表 字典 跳跃表 redis持久化 RDB持久化 AOF持久化 redis集群三种模式 主从模式 实现主从分离 提高吞吐 多机备份 哨兵模式
  • Python填写问卷星

    主要使用python实现问卷星的自动填写和提交 主要使用了https www jianshu com p 34961ceedcb4的代码 使用了X Forwarded For自动修改ip 我测试的时候是可以使用的 PS 我是在linux下面
  • idea 设置自动添加注释

    添加类注释 打开Settings 点击Apply OK 添加方法注释 添加组 选择test 添加Live Template text如下 Author yeluo Description description param param re
  • JSONObject对象的方法

    JSONObject 是 org json 库中的一个类 用于创建和操作 JSON 对象 以下是一些常用的 JSONObject 方法 1 put key value 向 JSON 对象中添加键值对 jsonObject put key v
  • 锂电池充放电电路设计与分析

    Lithium battery charge 锂电池充放电电路 1 USB插入检测电路 1 1 FUSE1 自恢复保险丝 当后续的电路发生短路等故障时 自动启动保护作用来保护外围的电源 避免损坏 因为经常出事故一般是电源出事故了 电源短路
  • leetcode_第17题_缺失的第一个正数——原地哈希

    题目 题目 分析 正常思路 另外制作一个哈希表 然后遍历就ok 但是这样不符合题目空间复杂度要求 所以采用原地哈希就可以了 思路 把正常数字nums i 交换存储到下标位置为nums i 1的地方 不正常数字不管 正常数字是指 值 1 le
  • linux(ubuntu)下C++访问mysql数据库

    Ubuntu安装msyql 安装mysql数据库 1 sudo apt get install mysql server 安装mysql客户端
  • HTTP服务器(二)

    前面已经实现了服务器的整体框架 现在就来具体实现HTTP服务器处理静态页面的逻辑 要获取具体的静态文件 就要知道要获取的文件的路径 我们分析url 协议方案名 使用http 或https 等协议方案名获取访问资源时要指定的协议类型 登录信息