当前位置: 首页 > news >正文

基于C语言 HTTP 服务器客户端的实验

基于 HTTP 服务器/客户端的实验

实验内容

1、使用 C 语言分别实现最简单的 HTTP 服务器和 HTTP 客户端

  • 服务器监听 80 端口,收到 HTTP 请求,解析请求内容,回复 HTTP 应答
  • 对于本地存在的文件,返回 HTTP 200 OK 和相应文件
  • 对于本地不存在的文件,返回 HTTP 404 File Not Found

2、服务器、客户端需要支持 HTTP Get 方法

3、服务器使用多线程支持多路并发

设计思路

1、已有代码框架已经能实现 socket 下的 echo,而实现 HTTP client 和 server 首先要做的是实现 HTTP GET 请求与相应。

2、在查询 HTTP GET 请求格式后,了解到 GET 请求报文格式如下图:

因此,本设计在 http-client.c 文件里添加了字符串 request_head 来生成请求报文,并在程序运行时通过 scanf 获得用户输入的请求文件路径。在加上请求头部后,Client 将请求发送给 Server

3、Server 在收到 HTTP GET 请求格式后,了解到响应报文格式如下图:

因此,本设计在 http-server.c 文件里添加了 int msg_handler(char * msg, char * path) 函数来解析请求报文,并提取出请求文件的地址。

4、Server 在打开目标文件后,读取目标文件的内容,并将内容传递至 return_messagereturn_message 此外还会附上必要的响应头部属性最后 Server 会将 return_message 发送给 Client

5、Server 为实现多线程发送文件的功能,本设计增加了 支持 pthread 相关函数。通过 pthread_detach 请求处理线程来实现多路并发。相关代码如下:

while(1) {pthread_t thread;pthread_create(&thread, NULL, handle_request, &s);pthread_detach(thread);
}

测试项目

1、所实现的 HTTP 服务器、客户端可以完成上述功能

使用客户端连续多次获取文件以及请求不存在的文件

本客户端通过与 SimpleHTTPServer 建立连接来测试客户端连续多次获得文件的能力,如下图:

左侧 Xterm 界面显示了 Client 接收文件的反馈。Client 在控制台打印输出了请求的内容和相应的内容。

左侧 Xterm 里,Client 分别请求了 1.txt2.txt 以及 3.txt

1.txt 里的内容为 crz is great 12.txt 不存在,3.txt 里的内容为 crz is great。 左边输出内容代表三个请求均反馈正确,且正常收取了 1.txt3.txt 两个文件。接收的文件名在原文件名前增加 recv_ ,如下图:

同时启动多个客户端进程分别获取文件

通过 pthread 支持多线程多路并发,本设计支持同时启动多个客户端进程分别获取文件,具体的测试实现是借助 wget 10.0.0.1/1.txt & wget 10.0.0.1/3.txt 实现两个 wget 指令同时请求,测试结果如下:

由图可知, 1.txt3.txt 均被顺利接收。

2、使用”python -m SimpleHTTPServer 80”和 wget 分别替代服务器和客户端,对端可以正常工作

上述测试方式即可验证每一端均可正常运行。另外为了测试本设计中的 ClientServer 之间可以正常通行,增加了下述测试:

即多个 ClientServer 发送请求。结果如下:

遇到的问题

在实验过程中,通过抓包发现,ClientSimpleHTTPServer 发送请求信号后, 如果多次发送请求,SimpleHTTPServer 在第一次正常返回响应后,TCP 会发出 RST 信号,导致 Client 如果不重新建立连接就会发生异常。

因此本设计中,如果 ClientSimpleHTTPServer 连续发包的话,需要在每次发包后重连。实现代码及其注释如下:

    /* The following part used depends on whether uses SimpleHttpServer. If you want to use SimpleHttpServer, you should enable this partbecause SimpleHttpServer will send TCP RST signal after once connection.*/ /* close(sock);sock = socket(AF_INET, SOCK_STREAM, 0);connect(sock, (struct sockaddr *)&server, sizeof(server));*/

参考文献及网站

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers

[2] https://www.cnblogs.com/an-wen/p/11180076.html

http://www.dtcms.com/a/564662.html

相关文章:

  • 如何利用 Jupyter 从浏览器访问远程服务器
  • C语言基础知识点简单案例分享之二——C语言全知识点速查宝典
  • 怎么找网站局域网电脑做网站服务器
  • 一男一女做那个的动漫视频网站网站怎样推广 优帮云
  • hive常用命令
  • AWS + 飞天CMS:高性能内容站的云端搭建方案
  • 800G光模块:驱动AI与云计算高速互联的核心引擎
  • Python每日一练---第三天:删除有序数组中的重复项
  • U-Net 的输入与输出:通用场景与扩散模型场景解析
  • 李宏毅机器学习笔记39
  • 【代码随想录算法训练营——Day57(Day56周日休息)】图论——53.寻宝
  • PPT+配音生成带旁白的PPT演示视频
  • abp vnext cli无法正常使用,卡在 Checking extensions..,cli修改abp版本及.net版本
  • 萤石摄像头使用NAS作为存储
  • 2025江西省职业院校技能大赛(中职组)移动应用与开发竞赛样题
  • 建站公司哪家好在哪里推广比较好
  • 在 iOS 18 的照片应用,如何批量隐藏截屏?
  • OK3568 Android11 实现 App 独占隔离 CPU 核心完整指
  • 湖南网站建设公司 都来磐石网络泰安营销型网站建设公司
  • Oracle 如何计算 AWR 报告中的 Sessions 数量
  • JavaScript 流程控制语句
  • 走向专精:我的NLP特化算子开发之旅
  • 如何写prompt?prompt收集
  • 打工人日报#20251103
  • 技术文章大纲:设备如何“开口说话”?
  • CH585 高速 USB模拟 CDC串口应用示例
  • 2024/07 JLPT听力原文 问题四
  • 【AAOS】【源码分析】Car Location服务(二)- NMEA 数据
  • 如何建立国外网站搜索引擎优化岗位
  • 怎么建立网站网址在线做网站需要什么