C语言-写一个简单的Web服务器(一)
基于TCP的web服务器
概述
C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。
关于网络的TCP协议在这里不在多说,大家可以查阅些资料。
工具
开发工具: CLion,编译器(Cygwin,如果不会用建议看看我的另一篇博客-CLion)。
演示效果图



## 创建socket对象```C
int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (0 > server_socket) {printf("[服务器] 创建socket对象失败,服务器启动失败...\n");return -1;
}
printf("[服务器] 创建socket成功....\n");
绑定服务器端口
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);int bind_ret = bind(server_socket, (struct sockaddr*) &my_addr, sizeof(my_addr));if (0 > bind_ret) {printf("[服务器]绑定端口%d失败,服务器启动失败\n", PORT);return -2;
}
printf("[服务器] 绑定端口:%d成功....\n", PORT);
监听服务器端口
int listen_ret = listen(server_socket, BACK_LOG);
if (0 > listen_ret) {printf("监听端口:%d失败,服务器运行失败....\n", PORT);return -3;
}
printf("[服务器] 监听端口:%d成功....\n", PORT);
建立连接
struct sockaddr_in accept_in;
socklen_t socklen = sizeof(accept_in);
int accept_socket = accept(server_socket, (struct sockaddr *) &accept_in, &socklen);if (-1 == accept_socket) {printf("[服务器] 接收请求失败,建立连接失败... \n");return -4;
}
printf("[服务器] 建立连接成功....\n");
获取客户端请求
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
ssize_t data = recv(accept_socket, buffer, sizeof(buffer), RECV_FLAG);if (data == 0) {printf("[服务器] 超时或对端主动关闭...\n");break;
}
if (0 > data) {printf("[服务器] 接收数据失败...\n");break;
}printf("[服务器] 与客户端建立连接成功...\n");
启动服务器
[服务器] 创建socket成功....
[服务器] 绑定端口:9999成功....
[服务器] 监听端口:9999成功....
[服务器] 建立连接成功....
[服务器] 与客户端建立连接成功...
下一回我们研究如何解析前端(浏览器)发过来的数据。
相关文章:
C语言-写一个简单的Web服务器(一)
基于TCP的web服务器 概述 C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。 关于网络的TCP协议在…...
MySQL底层原理
1. 请解释MySQL的逻辑架构和物理架构。 MySQL的逻辑架构和物理架构涉及到多个层面,包括网络连接、服务处理、存储引擎以及数据存储等部分。具体如下: 逻辑架构: 连接层(Connection Layer):客户端通过TCP…...
复盘-word
word-大学生网络创业交流会 设置段落,段后行距才有分 word-选中左边几行字进行操作 按住alt键进行选中 word复制excel随excel改变(选择性粘贴) 页边距为普通页边距定义 ##### word 在内容控件里面填文字(调属性)…...
Vue中的组件:构建现代Web应用的基石
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
【从部署服务器到安装autodock vina】
注意:服务器 linux系统选用ubuntu 登录系统,如果没有图形化见面可以先安装图形化界面 可以参考该视频 --> linux安装图形化界面 非阿里云ubuntu 依次执行以下命令 sudo apt-get update sudo apt-get install gnome sudo reboot阿里云ubuntu 需多执…...
如何使用ArcGIS Pro进行坡度分析
坡度分析是地理信息系统中一种常见的空间分析方法,用于计算地表或地形的坡度,这里为大家介绍一下如何使用ArcGIS Pro进行坡度分析,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据&…...
Vue3.2 + vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案
chunk-vendors.js 是/node_modules 目录下的所有模块打包成的包, 但是这包太大导致页面加载很慢(我的都要3-4秒了), 这个时候就会出现白屏的情况 解决方案 1、compression-webpack-plugin 插件解决方案 1)、安装 npm …...
Java学习笔记NO.18
T1.理工超市 (1)题目描述 编写一个程序,设计理工超市功能菜单并完成注册和登录功能的实现。显示完菜单后,提示用户输入菜单项序号。当用户输入<注册>和<登录>菜单序号时模拟完成注册和登录功能,最后提示…...
【JVM】聊聊垃圾回收之三色标记算法
在垃圾收集器 CMS中存在四个阶段,初始标记、并发标记、重新标记、并发清理。 那么在并发标记中由于没有STW,业务程序和GC程序是并发执行的,那么是如何实现对象的并发标记的。 并发垃圾回收 并发标记其实是一个宏观的过程,仍然需…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)
Image为图片组件,常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源,支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容&am…...
华为OD面试分享8(2024年)
个人情况: 23毕业,24一战跨考ustc,觉G。 211本,目标院校。 知识储备: 仅限408 用leetcode刷过408排序算法 0项目经验 时间线: 23.12.27 投的简历。当时啥也不会啥也不知道,听入职的同学说…...
Java的堆如何分代的?
前言: java对象一般都是朝生夕死,也有部分对象是一直存在的。两种对象如何都放在一起,进行垃圾回收的时候效率较低。所以通过将不同时期的对象放在不同的内存池中,节省垃圾回收的时间,提高性能。 组成: 新生…...
C# CallerMemberName、CallerFilePath、CallerLineNumber
CallerMemberName:调用某个方法的主方法名称 CallerFilePath:调用某个方法的主方法所在的类文件地址 CallerLineNumber:调用这个方法所在的行号 用这三个附加属性,需要设置默认值。...
Claude3系统解读与使用测评
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
vue3注册全局组件
注册单个全局组件 一.在main.ts中引入注册为全局组件 在main.ts 引入我们的组件跟随在createApp(App) 后面 切记不能放到mount 后面这是一个链式调用用其次调用 component 第一个参数组件名称 第二个参数组件实例 import { createApp } from vue import App from ./App.vue …...
vue 在什么情况下在数据发生改变的时候不会触发视图更新
在 Vue 中,通常数据发生变化时,视图会自动更新。但是,有几种情况可能导致数据变化不会触发视图更新: 1.对象属性的添加或删除: Vue 无法检测到对象属性的添加或删除。因为 Vue 在初始化实例时对属性执行了 getter/se…...
HTML世界之标签Ⅲ
一、dfn 标签 <dfn> 标签是一个短语标签,用来定义一个定义项目。 写法: <dfn></dfn> 二、dialog 标签 <dialog> 标签定义一个对话框、确认框或窗口。 属性 值 描述 open open 规定 dialog 元素是有效的,用户…...
【UE5】游戏框架GamePlay
项目资源文末百度网盘自取 游戏框架 游戏 由 游戏模式(GameMode) 和 游戏状态(GameState) 所组成 加入游戏的 人类玩家 与 玩家控制器(PlayerController) 相关联 玩家控制器允许玩家在游戏中拥有 HUD,这样他们就能在关卡中拥有物理代表 玩家控制器还向玩家提供 …...
用户管理【MySQL】
文章目录 查看用户信息创建用户修改密码删除用户授予权限收回权限 查看用户信息 在名为mysql的数据库中有一个表user维护着 MySQL 的用户信息。 其中: user: 表示该用户的用户名。host: 表示该用户可以从哪个主机登录,localhost…...
Rust教程:How to Rust-变量
本文为第1篇 专栏简介 本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议完全无计算机基础的同学 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用: 操作系统macOS Sonoma 14 / Apple M…...
私有云部署与运维全流程实战:从架构设计到精细化运维落地
随着数字化转型深入推进,数据安全、业务可控与成本优化成为企业与技术团队关注的核心,私有云凭借数据本地化、资源可定制、长期成本可控等优势,逐步成为中小团队、技术爱好者乃至企业级场景的重要选择。本文基于系统化课程学习与真实环境实操…...
终极免费音频解密工具:3分钟解锁QQ音乐加密文件实现跨平台播放
终极免费音频解密工具:3分钟解锁QQ音乐加密文件实现跨平台播放 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 您是否曾经从QQ音乐下载了喜爱的歌曲,…...
uniapp中uview组件库的NoticeBar滚动通知进阶配置与实战技巧
1. NoticeBar组件核心功能解析 滚动通知栏作为移动端高频使用的UI组件,在uniapp生态中通过uView的NoticeBar实现了开箱即用的解决方案。这个看似简单的组件实际上隐藏着不少值得深挖的特性。先说说它的基础能力:支持水平和垂直两种滚动模式,水…...
CSS 毛玻璃效果:从基础实现到高级应用
1. 毛玻璃效果基础实现 毛玻璃效果(Frosted Glass Effect)是近年来网页设计中非常流行的一种视觉效果,它能让界面元素呈现出半透明的磨砂质感,就像我们常见的磨砂玻璃一样。这种效果最大的特点就是既能保持背景内容的可见性&#…...
信号发生器选型避坑指南:如何根据测试需求选择合适波形/频率范围(附主流型号对比)
信号发生器选型避坑指南:如何根据测试需求选择合适波形/频率范围(附主流型号对比) 在电子测试测量领域,信号发生器如同乐队的指挥,决定了整个测试系统的节奏与精度。无论是研发新型通信设备,还是调试工业控…...
创建Controller HTTP测试脚本
创建Controller HTTP测试脚本 任务概述 为fastbee-open-api模块下的103个Controller创建对应的HTTP测试脚本文件,确保测试覆盖所有主要接口。 测试脚本规范 文件格式 文件名: {ControllerName}.http (如: DeviceController.http, SysUserController.http)存放位置: f:/project/…...
AI Agent vs Web3:哪个赛道更有钱景
如果实在没啥项目经验,可以看看知乎知学堂的AILLM开发课,最为讲的就是ai agent的应用开发,除了模型调用、对接、搭建外,还有很多「实战项目」拆解,自己做完可以写到简历里,求职面试的时候也不虚。 现在很多…...
Windows Server 2008 R2与H3C设备构建NTP时间同步网络实战指南
1. 为什么企业内网需要NTP时间同步? 想象一下这样的场景:公司财务系统显示的交易时间比OA系统慢了3分钟,监控录像的时间戳和门禁记录对不上,核心交换机日志里的故障时间与服务器告警时间相差整整12小时。这些看似小问题的时间不同…...
遗传算法优化技巧:如何用PMX交叉提升Python求解效率
遗传算法优化实战:PMX交叉在Python中的高效实现与调优 当你在解决旅行商问题(TSP)或排班优化时,是否遇到过传统交叉算子导致无效解激增的情况?部分匹配交叉(PMX)正是为解决这类排列编码问题而生的利器。作为遗传算法中最高效的交叉算子之一&a…...
如何实现抗体高效表达与纯化?
一、抗体表达与纯化为何是生物医药生产的核心环节?抗体表达与纯化是生物制药工艺流程中不可或缺的关键环节,直接决定了抗体药物的质量、产量和生产成本。高效表达系统能够确保抗体分子正确折叠并具备完整生物活性,而精细纯化过程则是去除杂质…...
