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

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成功....
[服务器] 建立连接成功....
[服务器] 与客户端建立连接成功...

下一回我们研究如何解析前端(浏览器)发过来的数据。

相关文章:

  • uniapp+node.js前后端做帖子模块:发布帖子评论(社区管理平台的小程序)
  • 链表中的经典问题——反转链表
  • C#拾遗补漏之goto跳转语句
  • Centos安装mysql8
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • 部署LVS+Keepalived高可用群集(抢占模式,非抢占模式,延迟模式)
  • MySQL利用逻辑备份恢复误删的数据库
  • vue 总结
  • redis使用笔记
  • 【Linux】线程封装_互斥
  • 怎么看待Groq
  • Redis缓存三大问题-穿透、击穿、雪崩
  • html地铁跑酷
  • map和set(二)——AVL树的简单实现
  • SQL之常用字符串函数
  • ECS应用管理最佳实践
  • javascript面向对象之创建对象
  • Laravel5.4 Queues队列学习
  • python学习笔记 - ThreadLocal
  • rc-form之最单纯情况
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Wamp集成环境 添加PHP的新版本
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 成为一名优秀的Developer的书单
  • 关于使用markdown的方法(引自CSDN教程)
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 用jQuery怎么做到前后端分离
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 大数据全解:定义、价值及挑战
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • ###STL(标准模板库)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #单片机(TB6600驱动42步进电机)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)(1.9) MSP (version 4.2)
  • (3)(3.5) 遥测无线电区域条例
  • (C++20) consteval立即函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (js)循环条件满足时终止循环
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (力扣)1314.矩阵区域和
  • (排序详解之 堆排序)
  • (实战篇)如何缓存数据
  • (算法设计与分析)第一章算法概述-习题
  • (转)ABI是什么
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)CentOS查看系统信息|CentOS查看命令