资讯动态

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

发布时间:2026/9/18 12:09:56 来源:尧图企业网站定制
前言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】网络抓包调试与网络安全防护原创不易如果本文对你有帮助欢迎点赞、收藏、关注三连有任何问题都可以在评论区留言我会及时回复。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价