【使用C语言创建一个简单的HTTP服务器】

news/2024/10/9 11:35:45/
http://www.w3.org/2000/svg" style="display: none;">

创建一个简单的HTTP服务器使用C语言涉及到网络编程的基础,特别是使用套接字(sockets)进行网络通信。这里提供一个非常基础的HTTP服务器实现案例,该服务器能够监听HTTP请求,对简单的GET请求返回HTML页面。

准备工作

确保你的系统支持网络编程,并且安装了C语言编译器,如GCC。

HTTP服务器代码

以下是一个简单的HTTP服务器实现,它监听本地的8080端口,并对GET请求返回一个简单的HTML页面。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>#define PORT 8080void handle_request(int client_sock) {char buffer[1024];int valread = read(client_sock, buffer, 1024);printf("%s\n", buffer);const char *http_response = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n<html><body><h1>Hello, World!</h1></body></html>";send(client_sock, http_response, strlen(http_response), 0);close(client_sock);
}int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);// 创建 socket 文件描述符if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 定义 sockaddr_in 结构体变量,并初始化address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定 socket 与 IP 地址和端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听端口if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Listening on port %d...\n", PORT);while(1) {if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {perror("accept");exit(EXIT_FAILURE);}printf("Handling client %s\n", inet_ntoa(address.sin_addr));// 处理客户端请求handle_request(new_socket);// 可以在这里关闭 new_socket,但已在 handle_request 中关闭}return 0;
}

编译和运行

  1. 将上述代码保存为 http_server.c
  2. 使用GCC编译:gcc http_server.c -o http_server
  3. 运行服务器./http_server

测试

打开浏览器或使用 curl 命令行工具,访问 http://localhost:8080。你应该能看到页面显示 “Hello, World!”。

注意事项

  • 这个服务器非常基础,只能处理简单的GET请求,并且不支持并发连接(每次只能处理一个请求)。
  • 在生产环境中,你需要考虑安全性、并发处理(如使用多线程或多进程)、错误处理、请求解析(使用库如libmicrohttpd)等多方面因素。
  • 示例中使用的 readsend 函数对于复杂的HTTP消息处理可能不足够,通常需要更精细的解析和响应构造。

http://www.ppmy.cn/news/1527394.html

相关文章

堪比理科博士生的最强AI大模型:GPT-o1全面测评它来了

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1…

K8s利用etcd定时备份集群结合钉钉机器人通知

如何通过脚本的方式进行K8s集群的备份 查看K8s中master节点中etcd集群的状态 kubectl get pods -n kube-system | grep etcd由于使用的etcd服务是K8s搭建时自身携带的,并不是独立搭建的etcd集群信息。使用 K8s 搭建集群时,etcd 是 Kubernetes 集成的一个重要组件因此需要查…

2024 年至今回顾:The Sandbox 创作者的历程及下一步展望

2024 年上半年是 The Sandbox 令人振奋的旅程&#xff01;从激动人心的里程碑、丰厚的奖励到创新的功能&#xff0c;我们见证了来自充满活力的社区的惊人创造力。 作为平台的生命线&#xff0c;我们致力于帮助创作者发光发热。让我们深入了解过去六个月中最激动人心的时刻和更…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…

三维数字图像相关法(3D-DIC)用于复合材料力学性能测试

三维数字图像相关法&#xff08;3D-DIC技术&#xff09;&#xff0c;通过将物体表面随机分布的斑点或伪随机分布的人工散斑场作为变形信息载体&#xff0c;是应用于计算机视觉技术的一种图像测量方法&#xff0c;是一种非接触的&#xff0c;用于全场三维坐标、位移、应变及运动…

104. 二叉树的最大深度【 力扣(LeetCode) 】

零、LeetCode 原题 104. 二叉树的最大深度 一、题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二、测试用例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出…

【深度学习 目标检测】基于Transformer检测模型RT-DETR,ultralytics 库如何训练和推理

当RT-DETR遇上侦探&#xff1a;一起揭秘实时检测的奥秘 在人工智能的世界里&#xff0c;有一场盛大的侦探比赛正在进行。我们的主角&#xff0c;RT-DETR&#xff0c;正准备在实时目标检测的领域中大展身手。这位侦探不仅反应迅速&#xff0c;而且头脑冷静&#xff0c;擅长在海…

Gateway学习笔记

目录 介绍&#xff1a; 核心概念 依赖 路由 断言 基本的断言工厂 自定义断言 过滤器 路由过滤器 过滤器工厂 自定义路由过滤器 全局过滤器 其他 过滤器执行顺序 前置后置&#xff08;&#xff1f;&#xff09; 跨域问题 yaml 解决 配置类解决 介绍&#x…