WebServer
一、服务器代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 80
#define BUFFER_SIZE 1024
void handle_request(int client_socket) {char buffer[BUFFER_SIZE];char response[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body><h1>Hello, World!</h1></body></html>";// 从客户端读取请求ssize_t bytes_read = read(client_socket, buffer, BUFFER_SIZE - 1);if (bytes_read == -1) {perror("读取请求失败");return;}buffer[bytes_read] = '\0';// 打印请求内容printf("收到请求:\n%s\n", buffer);// 发送响应给客户端ssize_t bytes_written = write(client_socket, response, strlen(response));if (bytes_written == -1) {perror("发送响应失败");}}
int main() {int server_socket, client_socket;struct sockaddr_in server_address, client_address;socklen_t client_address_len;// 创建套接字if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("创建套接字失败");exit(1);}// 设置地址重用int reuse = 1;if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) {perror("设置地址重用失败");exit(1);// 绑定地址server_address.sin_family = AF_INET;server_address.sin_port = htons(PORT);server_address.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {perror("绑定地址失败");exit(1);}// 启动监听if (listen(server_socket, 10) == -1) {perror("启动监听失败");exit(1);}printf("服务器已启动,监听端口 %d\n", PORT);// 接受连接并处理请求while (1) {client_address_len = sizeof(client_address);if ((client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_len)) == -1) {perror("接受连接失败");continue;}printf("接受新连接\n");// 处理请求handle_request(client_socket); // 关闭客户端套接字close(client_socket);printf("连接已关闭\n");}// 关闭服务器套接字close(server_socket);return 0;
}
二、代码思路
- 创建套接字:使用
socket函数创建一个TCP套接字。 - 设置地址重用:通过
setsockopt函数允许地址重用,以便在程序结束后迅速重启。 - 绑定地址:将套接字绑定到指定的IP地址和端口(这里是80)。
- 监听连接:调用
listen函数使服务器开始监听传入的连接请求。 - 接受连接:在一个无限循环中,使用
accept函数接受客户端连接。 - 处理请求:读取客户端请求并打印,然后发送一个简单的HTTP响应。
- 关闭连接:处理完请求后关闭客户端套接字,准备接受下一个连接。
相关文章:
WebServer
一、服务器代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #define PORT 80 #define BUFFER_SIZE 1024 void ha…...
java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码
项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能: 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息,知识分类,知识信息等,用户可以查看和下载管理员发布…...
go的结构体、方法、接口
结构体: 结构体:不同类型数据集合 结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段” 先声明一下我们的结构体: type Person struct {name stringage intsex string } 定义结构体法1: var p1 P…...
力扣第一题——删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1)额外空间的条件下完成。 示例 1&#x…...
Tuxera NTFS for Mac 2023绿色版
在数字化时代,数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作,然而,由于MacOS系统默认不支持NTFS的写操作,这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...
LeetCode[中等] 155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…...
Python青少年简明教程目录
Python青少年简明教程目录 学习编程语言时,会遇到“开头难”和“深入难”的问题,这是许多编程学习者都会经历的普遍现象。 学习Python对于青少年来说是一个很好的编程起点,相对容易上手入门,但语言特性复杂,应用较广&…...
Revit学习记录-版本2018【持续补充】
将墙面拆分并使用不同材料 【修改】>【几何图形】>【拆分面】(SF), 然后再使用【修改】>【几何图形】>【填色】(PT)进行填充 楼板漏在墙外 绘制楼板时最好选择墙体绘制,如果标高上不显示墙体,可以先选…...
深度学习01-概述
深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径,而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点: 1. 自动提取特征:与传统的机器学习方法不同,深度学习不需要手动…...
leetcode232. 用栈实现队列
leetcode232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元…...
智慧火灾应急救援航拍检测数据集(无人机视角)
智慧火灾应急救援。 无人机,直升机等航拍视角下火灾应急救援检测数据集,数据分别标注了火,人,车辆这三个要素内容,29810张高清航拍影像,共31GB,适合森林防火,应急救援等方向的学术研…...
eureka.client.service-url.defaultZone的坑
错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key,也就是defaultZone不支持snake-c…...
统信服务器操作系统【d版字符系统升级到dde图形化】配置方法
统信服务器操作系统d版本上由字符系统升级到 dde 桌面系统的过程 文章目录 一、准备环境二、功能描述安装步骤1. lightdm 安装2. dde 安装 一、准备环境 适用版本:■UOS服务器操作系统d版 适用架构:■ARM64、AMD64、MIPS64 网络:连接互联网…...
学习IEC 62055付费系统标准
1.IEC 62055 国际标准 IEC 62055 是目前关于付费系统的唯一国际标准,涵盖了付费系统、CIS 用户信息系统、售电系统、传输介质、数据传输标准、预付费电能表以及接口标准等内容。 IEC 62055-21 标准化架构IEC 62055-31 1 级和 2 级有功预付费电能表IEC 62055-41 STS…...
如何在Markdown写文章上传到wordpress保证图片不丢失
如何在Markdown写文章上传到wordpress保证图片不丢失 写文日期,2023-11-16 引文 众所周知markdown是一款nb的笔记软件,本篇文章讲解如何在markdown编写文件后上传至wordpress论坛。并且保证图片不丢失(将图片上传至云端而非本地方法) 一&…...
html,css基础知识点笔记(二)
9.18(二) 本文主要教列表的样式设计 1)文本溢出 效果图 文字限制一行显示几个字,多余打点 line-height: 1.8em; white-space: nowrap; width: 40em; overflow: hidden; text-overflow: ellipsis;em表示一个文字的大小单位&…...
(k8s)kubernetes 部署Promehteus学习之路
整个Prometheus生态包含多个组件,除了Prometheus server组件其余都是可选的 Prometheus Server:主要的核心组件,用来收集和存储时间序列数据。 Client Library::客户端库,为需要监控的服务生成相应的 metrics 并暴露给…...
初写MySQL四张表:(3/4)
我们已经完成了四张表的创建,学会了创建表和查看表字段信息的语句。 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)-CSDN博客 接下来,我们来学点对数据的操作:增 删 查(一部分)改 先来看这四张表以及相关…...
【Java】线程暂停比拼:wait() 和 sleep()的较量
欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在Java多线程编程中,合理地控制线程的执行是至关重要的。wait()和sleep()是两个常用的方法,它们都可以用来暂停线程的执行,但它们之间存在着显著的差异。本文将详…...
CQRS模型解析
简介 CQRS中文意思为命令于查询职责分离,我们可以将其了解成读写分离的思想。分为两个部分 业务侧和数据侧,业务侧主要执行的就是数据的写操作,而数据侧主要执行的就是数据的读操作。当然两侧的数据库可以是不同的。目前最为常用的CQRS思想方…...
2026年AI就业风口!这5个神仙岗位,高薪低门槛,普通人也能转行!
根据LinkedIn数据,2026年AI相关岗位增长迅猛,其中AI咨询顾问、机器学习工程师、AI产品经理、数据与检索工程师等岗位需求旺盛,且部分岗位对计算机科学学位要求不高。文章详细介绍了这5个岗位的火热原因、转行路径及薪资范围,并给出…...
2026年了,为什么很多企业做了智慧气象,结果还是没把风险降下来?
上个月,和一位新能源集团的运营负责人聊天,他抛出一个百思不得其解的问题:“我们花了300多万上了智慧气象系统,接了精细化预报,预警信息每天推送到手机、电脑、大屏,三个渠道同步。结果上个月一场雷暴&…...
React Native Keyboard Controller部署指南:生产环境最佳配置
React Native Keyboard Controller部署指南:生产环境最佳配置 【免费下载链接】react-native-keyboard-controller Keyboard manager which works in identical way on both iOS and Android 项目地址: https://gitcode.com/gh_mirrors/re/react-native-keyboard-…...
千问3.5-2B在物流场景:运单图片自动识别+收发件信息结构化
千问3.5-2B在物流场景:运单图片自动识别收发件信息结构化 1. 物流行业的痛点与机遇 每天,物流企业需要处理数以百万计的运单信息录入工作。传统的人工录入方式存在三个明显问题: 效率低下:一个熟练的录入员每小时最多处理50-80…...
换掉 Notepad++,事实证明它更牛逼!
提到文本编辑工具,大家肯定第一时间想到的是 Notepad 。Notepad 是一种流行的源代码编辑器,也是 Windows 用户的可靠记事本替代品。它是一个功能强大的实用程序,可在不占用大量存储空间的情况下提供最佳性能。不幸的是,它不适用于…...
避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了
避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了 在制造业数字化转型的浪潮中,SAP PP模块作为生产计划的核心枢纽,常常成为企业运营的"隐形战场"。许多实施顾问和计划专员在MD41和MD02这两个相似的事务码前陷…...
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...
intv_ai_mk11保姆级教学:输入‘你好’→追问第2点→指定表格输出,完整交互链路演示
intv_ai_mk11保姆级教学:输入你好→追问第2点→指定表格输出,完整交互链路演示 1. 快速了解intv_ai_mk11 intv_ai_mk11是一款基于Llama架构的AI对话助手,拥有7B参数规模,运行在GPU服务器上。它能帮助你完成各种任务,…...
S2-Pro在Windows系统的一键部署与简易客户端开发
S2-Pro在Windows系统的一键部署与简易客户端开发 1. 引言 如果你是一名Windows用户,想要快速体验S2-Pro的强大能力,但又不想折腾复杂的命令行操作,这篇文章就是为你准备的。我们将从零开始,带你完成两个关键步骤: 在…...
智能体AI崛起:本体论如何赋能药物研发新纪元?——2026智能体年深度解析
智能体AI作为生成式AI的进化方向,赋予AI决策和行动能力,在生命科学领域应用前景广阔。本文探讨了智能体AI的定义、架构及应用,重点分析了本体论如何通过语义标准化和跨系统映射,解决智能体在处理复杂科学知识、实现跨语言和系统语…...
