国科大计算机网络实验 HTTP服务器

news2024/9/22 1:45:00

UCAS_CN_LAB

HTTP服务器实验

实验要求

•实现:使用C语言实现最简单的HTTP服务器

•同时支持HTTP(80端口)和HTTPS(443端口)

•使用两个线程分别监听各自端口

•只需支持GET方法,解析请求报文,返回相应应答及内容

image-20231217164710387

实验环境

  • 编程语言:C
  • 系统环境:Ubuntu22.04
  • 依赖库:OpenSSL(用于HTTPS)

程序设计思路概述

server.c 文件是一个用C语言编写的程序,它使用在 basefun.h 中声明并在 basefun.c 中定义的函数来创建一个能够同时处理 HTTP 和 HTTPS 请求的服务器。它定义了两个主要功能,http_serverhttps_server,并使用 main 函数来初始化和运行这些服务器。以下是其功能的详细描述:

  1. HTTP 服务器(http_server 函数)

    • 初始化用于 HTTP 的服务器套接字
    • 将套接字绑定到指定的 HTTP 端口(SERVER_PORT_HTTP),并监听传入的连接
    • 使用 while 循环不断地接受新的客户端连接
    • 对于每个客户端连接,它会 fork 一个新进程来处理请求
    • 子进程调用 http_handle_client 来处理 HTTP 请求,然后退出
    • 父进程关闭客户端套接字,继续接受新的连接
  2. HTTPS 服务器(https_server 函数)

    • 使用 load_SSL 初始化 SSL 上下文
    • 为 HTTPS 设置服务器套接字
    • 将套接字绑定到指定的 HTTPS 端口(SERVER_PORT_HTTPS)并监听连接
    • 类似于 HTTP 服务器,它在循环中接受连接,并为每个客户端 fork 一个新进程
    • 在子进程中,创建一个新的 SSL 对象,将其与客户端套接字关联,并使用 SSL_accept 进行 SSL 握手
    • 握手成功后,调用 https_handle_client 来处理 HTTPS 请求
    • 子进程随后关闭客户端套接字并退出
  3. 同时运行的服务器

    • main 函数 fork 了两次,以创建两个单独的进程
    • 第一个子进程运行 HTTP 服务器,第二个子进程运行 HTTPS 服务器
    • 这种设计允许服务器同时处理 HTTP 和 HTTPS 请求
  4. 进程管理

    • main 函数使用 waitpid 等待两个子进程终止
    • 包含了适当的错误处理,以确保在 fork 过程中出现问题时服务器能够正确地运行
  5. 套接字和进程管理

    • 在 fork 后的子进程中关闭服务器套接字,这是并发服务器设计中的一个好习惯
    • 每个子进程负责在处理请求后关闭其客户端套接字
    • 其中子进程首先关闭监听套接字再处理

相关文件概述

  1. basefun.h:该文件包含用于服务器网络编程的函数声明。它引入了必要的库,定义了缓冲区大小,HTTP 和 HTTPS 的服务端口,并声明了一系列函数,包括套接字操作、SSL操作、文件处理、以及HTTP和HTTPS请求处理
  2. basefun.c:此文件实现了 basefun.h 中声明的函数。主要功能包括:
    • 网络套接字操作:创建、绑定、监听、接受连接、读写数据
    • SSL 操作:SSL 读写、SSL 上下文加载
    • 请求处理:解析请求、处理 HTTP 和 HTTPS 客户端请求、文件类型判断、URL解析
  3. server.c:这是服务器的主体部分,包括两个主要函数 http_serverhttps_server,以及用于初始化和运行这些服务器的 main 函数
    • http_server:设置 HTTP 服务器,监听端口80,对每个接入的客户端请求 fork 一个新进程,并在子进程中调用 http_handle_client
    • https_server:设置 HTTPS 服务器,监听端口443,加载 SSL 上下文,对每个客户端请求进行类似处理,但使用 SSL 加密的读写函数
    • main:在主函数中,程序 fork 两次,分别运行 HTTP 和 HTTPS 服务器,允许它们并发处理请求

此程序实现了一个能够处理 HTTP 和 HTTPS 请求的基本 Web 服务器模型。它主要应用来 C 语言中的网络编程、进程管理和 SSL/TLS 处理

运行结果显示

  1. 在虚拟机上执行 sudo python3 topo.py

image-20231217165222524

  1. 在虚拟机上编译并c语言程序
mkdir build
cd build
cmake ..
make
  1. 在虚拟机上执行程序sudo ./server

image-20231217165552736

  1. 在本地运行测试程序,验证程序正确性python3 test.py

image-20231217172636510

  1. 请求服务器上的视频,浏览器输入https://10.37.129.41/dir/video.mp4

image-20231217173300690

  1. 请求服务器上的html文档,浏览器输入https://10.37.129.41/dir/index.html

image-20231217185119474

实验结论

  • 实验展示了如何使用 C 语言和相关网络编程技术来创建简单的 HTTP 和 HTTPS 服务器
  • 通过对 socket 编程和 SSL加密的应用,服务器能够有效地处理网络请求
  • 并发处理机制(通过 fork)使服务器能够同时处理多个客户端请求

实验总结

basefun.c, basefun.h, 和 server.c 文件实现的 HTTP 和 HTTPS 服务器能够在基本水平上处理网络请求,展示了网络编程和SSL集成的基本原理。但是,对于生产环境,还需要更多的安全性、稳定性和可扩展性考虑。

项目地址

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

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

相关文章

多点通信与域套接字:2024/3/4

作业1&#xff1a;广播 发送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//1.创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.设置当前…

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

大模型推荐落地啦!融合知识图谱,蚂蚁集团发布!

引言&#xff1a;电商推荐系统的新突破 随着电子商务平台的蓬勃发展&#xff0c;推荐系统已成为帮助用户在信息过载时代中筛选和发现产品的关键工具。然而&#xff0c;传统的推荐系统主要依赖历史数据和用户反馈&#xff0c;这限制了它们在新商品推出和用户意图转变时的有效性…

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;主题&#xff08;Topics&#xff09;是实现节点之间通信的主要机制之一。节点&#xff08;Node&#xff09;可以发布&#xff08;publish&#xff09;消息到话题&#xff0c;或者订阅&#xff08;subscribe&…

搜索回溯算法(DFS)1------递归

目录 简介&#xff1a; 递归问题解题的思路模板 例题1&#xff1a;汉诺塔 例题2&#xff1a;合并两个有序链表 例题3&#xff1a;反转链表 例题4&#xff1a;两两交换链表中的节点 例题5&#xff1a;Pow&#xff08;x,n&#xff09;-快速幂 结语&#xff1a; 简介&…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

Vue.js 深度解析:模板编译原理与过程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶监造系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的船舶监造系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

山西电力市场日前价格预测【2024-02-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-25&#xff09;山西电力市场全天平均日前电价为386.45元/MWh。其中&#xff0c;最高日前电价为765.92元/MWh&#xff0c;预计出现在18:45。最低日前电价为203.79元/MWh&#xff0c;预计…

【计算机毕业设计】044学生管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C# 不可识别数据库格式问题

C#是一种流行的编程语言&#xff0c;用于开发各种类型的应用程序&#xff0c;包括与数据库交互的应用程序。然而&#xff0c;在处理数据库时&#xff0c;有时会遇到一些错误和问题。其中之一就是数据库格式不可识别的错误。 在C#中&#xff0c;我们通常使用ADO.NET来连接和操作…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池

文章目录 openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池235.1 背景信息235.2 前提条件235.3 操作过程235.3.1 创建资源池235.3.2 管理资源池235.3.3 删除资源池 235.4 查看资源池的信息 openGauss学习笔记-235 openGauss性能调优-系…

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu&#xff0c;作为一款流行的Linux发行版&#xff0c;其命令行界面&#xff08;CLI&#xff09;为用户提供了丰富的功能和灵活性。然而&#xff0c;对于新手来说&#xff0c;命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

Python算法100例-3.1 回文数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1&#xff0e;问题描述 打印所有不超过n&#xff08;取n<256&#xff09;的其平方具有对称性质的数&#xff08;也称回…

加密与安全_ 凯撒密码

文章目录 Pre概述Code 实现 凯撒密码字母频率分析攻击Code解密凯撒密码 小结 Pre PKI - 02 对称与非对称密钥算法 概述 凯撒密码是一种简单的替换加密技术&#xff0c;也称为移位密码。它是古典密码学中最早的密码之一&#xff0c;得名于古罗马军队领袖凯撒尤利乌斯&#xff…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置&#xff0c;点完成就可以了 网络连接&#xff0c;右上角打开 开始安装&#xff0c;输入ROOT密码&#xff0c;创建用户 点击重启&#xff0c;等待 重启完成之后出现下面的界…

MATLAB环境下基于离散小波变换的心电信号伪影去除及PQRST波检测

可穿戴个人健康监护系统被广泛认为是下一代健康监护技术的核心解决方案。监护设备不断地感知、获取、分析和存储大量人体在日常活动中的生理数据&#xff0c;为人体的健康状况提供必要的、准确的、集成的和长期的评估和反馈。在心电监测领域&#xff0c;可穿戴传感器具有以下应…

镜头畸变模型及去畸变的原理

1. OpenCV去畸变undistortPoints原理解析 Opencv中镜头畸变包含了径向畸变和切向畸变&#xff0c;本章节主要阐述镜头畸变模型以及去畸变的原理。 1.1 镜头畸变模型 参考opencv文档 https://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html&#xff0c;opencv…