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

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集成的基本原理。但是,对于生产环境,还需要更多的安全性、稳定性和可扩展性考虑。

项目地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字IC基础:数字集成电路书籍推荐

相关阅读 数字IC基础https://blog.csdn.net/weixin_45791458/category_12365795.html?spm1001.2014.3001.5482 目录 Verilog HDL 《Verilog HDL数字设计与综合(本科教学版)》 (美)萨米尔帕尔尼卡 《Verilog高级数字系统设计技术与实例分析》(美)基肖尔米什拉 《Verilog编…

终结数据混乱!开发者必学的GraphQL秘籍,高效API只需一步

在数字世界中,API就如同城市中的道路,连接着各种服务和数据。然而,传统的API(如RESTful)虽然功不可没,但随着技术复杂性和需求多样性不断攀升,它们显露出的局限性也呼唤着新的可能出现。此时&am…

四川尚熠电子商务有限公司电商服务领域的佼佼者

在数字化浪潮席卷全球的今天,电子商务已成为推动企业转型升级、拓展市场渠道的重要力量。四川尚熠电子商务有限公司,作为一家专注于抖音电商服务的公司,凭借其独特的服务模式和创新的营销策略,在激烈的市场竞争中脱颖而出&#xf…

Android 获取USB相机支持的分辨率有多少

直接上代码 private fun getCamera() {// 获取系统相机服务val cameraManager requireContext().getSystemService(Context.CAMERA_SERVICE) as? CameraManagerif (cameraManager ! null) {// 在这里进行相机管理器的操作// 获取相机设备的 ID(这里假设使用第一个相…

C++:类与对象(1)

创作不易,谢谢支持! 一、面向过程和面向对象 1、C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 如我们要实现洗衣服: 2、而C是基于面向对象的,关注的是…

【EI会议征稿通知】第三届仿真设计与计算建模国际学术会议(SDCM 2024)

The 3rd International Conference on Simulation Design and Computational Modeling 第三届仿真设计与计算建模国际学术会议(SDCM 2024) 第三届仿真设计与计算建模国际会议(SDCM 2024)将于 4 月 26-28 日在中国重庆召开。第二届…

理解python3中的回调函数

百度百科说:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#…

PCIE 4.0 Power Mangement

PCIe总线的电源管理包含了ASPM和软件电源管理两方面的内容,所谓ASPM是指PCIe路在没有系统软件参与的情况下,由PCIe链路自发进行的电源管理方式;而软件电源管理是指PCI-PM机制(与PCI总线兼容)。 1. Link State Power M…

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备,一直在刷算法题,确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来,那么Python的爬虫就这样开始学习了。 注:文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…

【深蓝学院】移动机器人运动规划--第7章 集群机器人运动规划--笔记

文章目录 0. Contents1. Multi-Agent Path Finding (MAPF)1.1 HCA*1.2 Single-Agent A*1.3 ID1.4 M*1.5 Conflict-Based Search(CBS)1.6 ECBS1.6.1 heuristics1.6.2 Focal Search 2. Velocity Obstacle (VO,速度障碍物)2.1 VO2.2. RVO2.3 ORCA 3. Flocking model&am…

【Leetcode】2369. 检查数组是否存在有效划分

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分: 子数组 恰 由 2 个…

C/C++ 迷宫游戏

游戏介绍 这个迷宫探险游戏有以下功能: 探险:选择该选项后,玩家会进入地下迷宫进行探险。在随机事件中,可能会遇到陷阱、发现金币或者什么都没有发生。陷阱会使玩家失去一定的生命值,金币可以增加玩家的金币数量。 休…

ToDesk - macOS 上轻便好用的远程控制

文章目录 官网 https://www.todesk.com个人版(免费)下载地址: https://www.todesk.com/download.html 支持系统类型 Windows、macOS、Android、iOS、Linux 应用大小为 320MB 左右 使用界面

SpringBoot整合rabbitmq-主题交换机队列(四)

说明:Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定,这个绑定的Routingkey是包含通配符的,满足通配符的队列会接收到消息。 通配符规则: #:匹配一个或多个词 *:匹配一个词 例如&#xff…

2024年工控人职场求生之路

2024年,眼看项目多了活儿忙了 工控工程师们开始上演飞驰人生 不是跑去客户那里调设备 就是在电脑上搭项目做画面搭系统 每天都过热辣滚烫 你说忙吧,每天也就干那些事儿 你说多有成就感呐 我觉得我能有绝对的主导权和话语权 那都是天方夜谭 2024年…

给孩子选台灯什么样的好?2024年最值得购买的护眼台灯推荐

自从孩子上学以后,很多家长就一直给孩子添置各种各样的学习用品,例如专用的学习桌椅、书架,不过随着作业的增多,发现最需要的物品就是一盏好的护眼台灯。然而有些商家为了降低成本,不惜牺牲产品质量,使用没…

没有项目经历,该如何写简历?

没有项目经历,我该如何写简历 一、前言二、挖掘自己三、看现成的项目经验,转化成自己的语言1、硬件方面2、软件方面 四、最后 一、前言 相信有很多刚出来找工作的人会遇到这种情况,因为自身没有项目经历,投了很多的简历都石沉大海…

【详识JAVA语言】逻辑控制

概述 我的曾经: 早上8:00起床--->洗漱--->吃早饭--->上课--->吃午饭--->上课--->运动--->吃完饭--->玩手机--->睡觉 每天的生活貌似都是这么规律,顺序的做着每件事,前途一片渺茫~~~ 直到有一天: 我…

外卖点餐小程序二合一自由切换商业运营版 带完整的搭建教程

“外卖点餐小程序二合一自由切换商业运营版”的源码,是基于当前最流行的移动应用开发框架开发的。它整合了前端展示、后端管理、数据库存储等多个功能模块,为用户提供了一个高效、稳定、易于维护的外卖点餐解决方案。这套源码不仅适用于初创企业快速搭建…

基于ssm疫情期间高校防控系统+vue论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,学生信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大…