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

【Linux 实战 - 26】轻量级 HTTP 服务器原理与 C 语言 Socket 实现

前言HTTP 是互联网最核心的应用层协议几乎所有网页、API、嵌入式 Web 控制都基于 HTTP 实现。本文从HTTP 协议基础讲起使用Linux C Socket从零实现一个可运行、可扩展、轻量级 HTTP 服务器适合学习网络编程、嵌入式 Web、后端原理。1. HTTP 协议核心基础面试常考1.1 HTTP 是什么HTTPHyperText Transfer Protocol超文本传输协议是基于 TCP 的无状态、应用层协议默认端口 80。特点一问一答模式客户端请求 → 服务器响应短连接为主HTTP/1.1 默认长连接纯文本协议可读性强1.2 HTTP/1.1 请求方法8 种常用 4 种方法作用特点GET获取资源参数在 URL无请求体幂等、可缓存POST提交数据参数在请求体常用于表单、上传、登录PUT更新资源完整替换资源DELETE删除资源删除指定资源最核心区别GET 把参数放 URLPOST 把参数放请求体body1.3 HTTP 请求报文格式一个标准 HTTP 请求由 4 部分组成请求行方法 URL 协议版本请求头键值对空行必须有分隔头和体请求体POST 才有数据GET 为空示例plaintextGET /index.html HTTP/1.1 Host: 192.168.1.100:8080 User-Agent: Mozilla/5.0 Connection: close (空行) (GET 无请求体)1.4 HTTP 响应报文格式状态行协议版本 状态码 描述响应头空行响应体HTML/JSON/ 图片等示例HTTP/1.1 200 OK Content-Type: text/html Content-Length: 128 Connection: close htmlHello HTTP Server/html1.5 高频 HTTP 状态码状态码含义场景200请求成功正常返回页面301/302重定向网址跳转400请求错误报文格式非法403禁止访问权限不足404资源不存在文件找不到500服务器错误代码崩溃502网关错误代理 / 后端挂了2. 轻量级 HTTP 服务器设计思路基于Linux TCP Socket实现核心流程创建 TCP 套接字绑定 IP 端口8080监听客户端连接接受连接读取 HTTP 请求报文解析请求路径如 /index.html读取文件并构造 HTTP 响应发送响应并关闭连接循环处理下一个请求3. C 语言完整实现可直接编译运行3.1 代码功能支持GET 请求自动返回index.html文件不存在返回404 页面标准 HTTP 响应格式可直接浏览器访问3.2 完整代码#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include fcntl.h #define PORT 8080 #define BUFFER_SIZE 1024 #define DEFAULT_FILE index.html // 发送 HTTP 响应给客户端 void send_http_response(int client_fd, const char *file_path) { char response_header[BUFFER_SIZE]; char response_body[BUFFER_SIZE]; ssize_t bytes_read; // 打开文件 int file_fd open(file_path, O_RDONLY); if (file_fd 0) { // 404 响应 snprintf(response_header, sizeof(response_header), HTTP/1.1 404 Not Found\r\n Content-Type: text/html\r\n Connection: close\r\n\r\n htmlbodyh1404 Not Found/h1/body/html); send(client_fd, response_header, strlen(response_header), 0); return; } // 200 响应头 snprintf(response_header, sizeof(response_header), HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n Connection: close\r\n\r\n); send(client_fd, response_header, strlen(response_header), 0); // 发送文件内容 while ((bytes_read read(file_fd, response_body, sizeof(response_body))) 0) { send(client_fd, response_body, bytes_read, 0); } close(file_fd); } int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len sizeof(client_addr); char buffer[BUFFER_SIZE]; char file_path[256]; // 1. 创建 TCP 套接字 server_fd socket(AF_INET, SOCK_STREAM, 0); if (server_fd 0) { perror(socket failed); exit(EXIT_FAILURE); } // 端口复用解决重启报错 int opt 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, opt, sizeof(opt)); // 2. 绑定地址与端口 server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr INADDR_ANY; server_addr.sin_port htons(PORT); if (bind(server_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(bind failed); exit(EXIT_FAILURE); } // 3. 监听 if (listen(server_fd, 5) 0) { perror(listen); exit(EXIT_FAILURE); } printf(HTTP Server Running on http://127.0.0.1:%d\n, PORT); // 循环处理客户端 while (1) { // 4. 接受连接 client_fd accept(server_fd, (struct sockaddr *)client_addr, client_addr_len); if (client_fd 0) { perror(accept); continue; } // 5. 读取 HTTP 请求 memset(buffer, 0, BUFFER_SIZE); read(client_fd, buffer, BUFFER_SIZE - 1); printf( HTTP Request \n); printf(%s\n, buffer); // 6. 解析 GET 请求路径 if (!strncmp(buffer, GET , 4)) { char *path buffer 4; char *end strchr(path, ); if (end) { *end \0; // 根目录默认访问 index.html if (!strcmp(path, /)) strcpy(file_path, DEFAULT_FILE); else strcpy(file_path, path 1); // 去掉 / } } else { strcpy(file_path, DEFAULT_FILE); } // 7. 发送响应 send_http_response(client_fd, file_path); // 8. 关闭连接 close(client_fd); } close(server_fd); return 0; }3.3 网页文件 index.htmlhtml head meta charsetutf-8 titleC 语言 HTTP Server/title /head body h1Hello, Linux HTTP Server!/h1 p基于 C Socket 实现轻量级 Web 服务器/p /body /html3.4 编译与运行gcc http_server.c -o http_server ./http_server浏览器访问http://127.0.0.1:80804. 运行效果成功访问 → 显示index.html访问不存在文件 → 返回404 Not Found终端打印完整 HTTP 请求报文5. 扩展方向进阶必看你可以在这个基础上继续扩展让项目更有含金量支持 POST 请求解析表单、JSON、文件上传多进程 / 多线程 / 线程池支持并发支持图片、CSS、JS 静态资源添加 Content-Length 准确计算实现长连接 Keep-AliveCGI 支持动态页面集成嵌入式 LinuxSSD202、RK3588 等添加日志系统、错误处理6. 总结本文从 HTTP 协议原理出发使用Linux C Socket实现了一个最小可用 HTTP 服务器。下篇预告【Linux 实战 - 27】网络抓包调试与网络安全防护原创不易如果本文对你有帮助欢迎点赞、收藏、关注三连有任何问题都可以在评论区留言我会及时回复。

相关文章:

【Linux 实战 - 26】轻量级 HTTP 服务器原理与 C 语言 Socket 实现

前言 HTTP 是互联网最核心的应用层协议,几乎所有网页、API、嵌入式 Web 控制都基于 HTTP 实现。本文从 HTTP 协议基础 讲起,使用 Linux C Socket 从零实现一个可运行、可扩展、轻量级 HTTP 服务器,适合学习网络编程、嵌入式 Web、后端原理。…...

AI智能体监控平台agentwatch:从可观测性到性能优化实战

1. 项目概述:一个面向AI智能体生态的监控与洞察工具最近在折腾AI智能体(Agent)相关的项目,发现一个挺有意思的现象:当你的智能体数量从几个增长到几十个甚至更多时,管理它们的状态、追踪它们的决策过程、分…...

Python自动化脚本断点续传下载实战:大文件处理完整指南

大家好,我是扣扣。今天来聊聊一个很实用的功能——断点续传下载。 为什么要关心断点续传? 你有没有遇到过这些情况: 下载一个大文件,下载到99%的时候网络断了,得从头再来 公司网络不稳定,几十MB的文件死活下载不下来 凌晨跑个定时任务下载数据,结果因为网络波动失败了…...

保姆级教程:手把手教你修改Material Studio的Perl交联脚本,适配你的自定义聚合物

深度定制Material Studio交联脚本:从环氧树脂到多元聚合物的Perl魔改指南 当你第一次在论文中看到那个神奇的环氧树脂交联脚本时,可能和我一样兴奋——终于不用手动跟踪每个反应位点了!但现实很快给了我们这些研究聚酰亚胺、聚氨酯等非环氧体…...

告别手动解析!用CANdb++制作DBC文件保姆级教程(附Intel/Motorola格式详解)

告别手动解析!用CANdb制作DBC文件保姆级教程(附Intel/Motorola格式详解) 在车载电子系统开发中,工程师们每天需要处理海量的CAN总线原始数据。这些以十六进制形式呈现的报文,就像一本没有词典的外语书籍——你能看到字…...

Taotoken模型广场在项目技术选型中的实际使用感受

Taotoken模型广场在项目技术选型中的实际使用感受 1. 模型广场的界面设计与信息组织 Taotoken模型广场采用分类清晰的布局设计,左侧导航栏按模型用途(如文本生成、代码补全、多模态等)和厂商进行分组。每个模型卡片展示关键信息&#xff1a…...

Reolink E1 Outdoor Pro 4K智能摄像头WiFi 6技术评测

1. Reolink E1 Outdoor Pro 4K智能安防摄像头深度评测作为一名长期测试各类安防设备的博主,我最近上手了Reolink最新推出的E1 Outdoor Pro 4K智能安防摄像头。这款产品最吸引我的地方在于它率先在消费级安防领域采用了WiFi 6技术——要知道目前市面上绝大多数同类产…...

秩序之舞——排序算法中的数字星河

一,引言 在计算机科学的世界里,排序是最基础、也最重要的核心算法之一。无论是日常开发中的列表数据整理、数据库查询的结果规整,还是电商平台商品价格、销量的智能排行,亦或是机器学习、大数据处理中的数据预处理环节&#xff0c…...

Docker生态资源精选列表:从入门到实战的完整指南

1. 项目概述:一个Docker生态的“藏宝图”如果你在容器技术领域摸爬滚打过一段时间,尤其是深度使用Docker,那你一定有过这样的经历:为了解决一个特定的问题,比如搭建一个高性能的日志收集栈,或者寻找一个轻量…...

租房党、学生党、居家党|2026年电钢琴按场景选购攻略,机型推荐

我发现很多新手在买电钢琴的时候,会陷入一个思维误区:只盯着价格和品牌,却完全没有思考过我会在哪里用它这个问题。结果要么买了个便携款放在家里嫌它太轻没质感,要么搬了台立式琴到宿舍发现根本没地方放。事实上,电钢…...

2026新手吉他选购指南:1000-1500 元热门吉他横评,初学者选哪把琴?

新手入门选吉他,1000-1500 元是兼顾性价比与使用体验的主流价位,这一区间的的四款吉他都是热门之选。几款琴各有侧重,有的胜在品控口碑,有的赢在价格亲民,但新手选琴的核心终究是材质稳定、手感友好、配套完善&#xf…...

基于RAG与向量搜索的本地语义文件搜索系统构建指南

1. 项目概述:当本地文件库遇上大语言模型如果你和我一样,电脑里塞满了各种文档、笔记、代码片段和PDF报告,每次想找点东西都得靠记忆或者全局搜索碰运气,那你一定理解那种“信息就在那里,但我就是找不到”的无力感。传…...

Redis分布式锁进阶第十五篇

Redis分布式锁进阶第十五篇:热点锁雪崩根治方案 分片隔离实战落地 大促峰值零卡顿优化一、本篇定位:高并发压垮Redis的最后解法前面十四篇,我们搞定了死锁、看门狗、主从丢锁、联锁乱序、监控巡检。第十五篇专门解决大促必现、排查最难、影…...

AntiDupl:如何用专业级图像去重工具高效管理你的数字资产

AntiDupl:如何用专业级图像去重工具高效管理你的数字资产 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因电脑中堆积如山的重复图片而感到困扰&a…...

Nuxt 学习笔记(三)

SEO 头部设置 基于 Unhead 提供 useHead 管理 <head>&#xff0c;也可在 nuxt.config.ts 的 app.head 中配置。 同时提供 useHeadSafe 来支持安全的头部修改策略 interface MetaObject {title?: string; // 文档标题titleTemplate?: string | ((title?: string) &…...

使用Taotoken聚合API为你的Node.js后端服务注入AI能力

使用Taotoken聚合API为你的Node.js后端服务注入AI能力 1. 统一接入多模型的技术方案 在现代Web应用开发中&#xff0c;智能对话功能已成为提升用户体验的重要组件。作为全栈开发者&#xff0c;我们经常面临模型选型与接入的挑战。Taotoken提供的OpenAI兼容API解决了这一痛点&…...

OpenWrt网易云音乐解锁插件:3分钟实现全屋音乐自由

OpenWrt网易云音乐解锁插件&#xff1a;3分钟实现全屋音乐自由 【免费下载链接】luci-app-unblockneteasemusic [OpenWrt] 解除网易云音乐播放限制 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-unblockneteasemusic 还在为网易云音乐中那些灰色的"无版权…...

从单片机到Linux内核:一文搞懂原子操作atomic_t的前世今生与实战

从单片机到Linux内核&#xff1a;一文搞懂原子操作atomic_t的前世今生与实战 在嵌入式开发领域&#xff0c;从单片机转向Linux内核开发就像从平静的湖泊驶向波涛汹涌的大海。习惯了在STM32上用__disable_irq()简单粗暴地解决并发问题的工程师&#xff0c;初次面对Linux内核的SM…...

豆包付费订阅背后,藏着一个反直觉的真相:给你顶配AI,你用得动吗?

豆包悄悄在App Store更新了付费订阅声明。68元/月&#xff0c;200元/月&#xff0c;500元/月&#xff0c;国产AI的"免费午餐"&#xff0c;正式宣告终结。这不是一条普通的商业新闻。字节扛了这么久&#xff0c;最终还是选了商业化。表面是商业压力&#xff0c;背后是…...

Arduino UNO SPE Shield:工业物联网通信解决方案

1. Arduino UNO SPE Shield项目概述作为一名长期从事工业自动化开发的工程师&#xff0c;当我第一次接触到Arduino UNO SPE Shield时&#xff0c;立刻意识到这款扩展板将为工业物联网(IIoT)项目带来革命性的便利。这款由Arduino官方推出的扩展板&#xff0c;通过Microchip LAN8…...

基于LangChain与Ollama的本地化网页摘要工具实践指南

1. 项目概述&#xff1a;一个基于本地大模型的网页摘要工具最近在折腾信息收集和整理&#xff0c;发现每天要看的网页和视频实在太多了&#xff0c;时间根本不够用。相信很多做研究、写报告或者单纯想高效获取信息的朋友都有同感。传统的摘要工具要么是云端服务&#xff0c;有隐…...

微信聊天记录解密终极指南:快速恢复被加密的珍贵数据

微信聊天记录解密终极指南&#xff1a;快速恢复被加密的珍贵数据 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾经因为手机损坏、微信重装或误删除而丢失了重要的聊天记录&#xff1f;当那些珍贵…...

多智能体协作平台AgentWall:从架构设计到工程实践

1. 项目概述&#xff1a;从“墙”到“智能体协作平台”的蜕变最近在开源社区里&#xff0c;一个名为agentwall/agentwall的项目引起了我的注意。乍一看这个标题&#xff0c;很容易让人联想到某种网络隔离或安全边界技术&#xff0c;毕竟“wall”这个词在技术领域通常指向防火墙…...

OpenUI深度解析:AI驱动界面生成从原理到实战部署

1. 项目概述&#xff1a;当AI学会“画”界面最近在跟几个做产品经理和前端开发的朋友聊天&#xff0c;大家不约而同地都在吐槽一件事&#xff1a;从想法到可交互的原型&#xff0c;这个链路太长了。产品经理用Figma画半天&#xff0c;交付给前端&#xff0c;前端还得吭哧吭哧地…...

文海问津项目日志(四)

本次主要实现了网关的错误归一化与统一 JSON Envelope功能目标所有失败请求都返回一致的 JSON 结构&#xff0c;便于前端统一处理错误 body 必含 requestId&#xff0c;便于定位链路网关级错误&#xff08;鉴权/限流/未知异常&#xff09;不依赖下游服务关键代码原文 解读1 统…...

Total War模组开发的现代化架构:深度解析Rusted PackFile Manager(RPFM)的技术实现

Total War模组开发的现代化架构&#xff1a;深度解析Rusted PackFile Manager&#xff08;RPFM&#xff09;的技术实现 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding t…...

多智能体系统架构设计:从隔离沙箱到编排引擎的工程实践

1. 项目概述&#xff1a;从零构建一个智能体协作与隔离平台最近在开源社区里&#xff0c;一个名为agentwall/agentwall的项目引起了我的注意。乍一看这个名字&#xff0c;你可能会联想到“智能体墙”或者“代理墙”&#xff0c;但它的核心远不止于此。简单来说&#xff0c;这是…...

递归文件搜索工具recursearch:声明式配置与自动化集成实践

1. 项目概述&#xff1a;一个为递归搜索而生的工具如果你经常和文件系统打交道&#xff0c;无论是作为开发者、数据分析师还是系统管理员&#xff0c;肯定遇到过这样的场景&#xff1a;需要在海量的目录和文件中&#xff0c;精准地找到那些符合特定模式的文件&#xff0c;并且还…...

从OSGB到3DTiles:揭秘LOD策略(add vs replace)在Cesium中的实战选择

从OSGB到3DTiles&#xff1a;LOD策略在Cesium中的工程化实践 当实景三维数据从专业建模软件走向Web端时&#xff0c;OSGB到3DTiles的转换就像给大象设计一套适合在不同房间穿行的衣服——既要保持整体形态&#xff0c;又要适应空间限制。作为连接数据生产与WebGL渲染的关键环节…...

智能多平台文件解析引擎:基于模块化架构的高性能网盘直链获取解决方案

智能多平台文件解析引擎&#xff1a;基于模块化架构的高性能网盘直链获取解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国…...