我最近在学习 C 语言,看的一本书叫做 《C Primer Plus》,这本书对 C 语言的描写、特性介绍、代码示例都介绍的比较详细,是小白入门 C 语言非常不错的一本书,还有一本经典书叫做《C 程序设计语言》,这本书可以作为 《C Primer Plus》下一步要解锁的成就。

那么只是看书学习是不够的,还需要学习别人写的优秀代码,汲取优秀的代码逻辑和编程范式,并把他融入到自己的血液中,才能在编程这条路上不断进步。

最近接触到了一个叫做 tinyhttpd 的项目,这个项目想必大家学 C 的应该都听过,这是 J. David Blackstone 在 1999 年写的一个小型 HTTP 服务器的项目,用来学习非常不错,可以帮助我们真正理解服务器程序的本质以及 HTTP 的请求响应过程。大家可以去官网下载这个项目 http://tinyhttpd.sourceforge.net

当然,也有同学 fork 了这个项目,大家也可以在 https://github.com/EZLippi/Tinyhttpd 直接 fork 或者 clone。

我最近抽空也是把这个项目跑起来并研究了一下。

本地自己搭了一台服务器,用的是 vmvare 和 Centos 7 ,vmvare 可以随处下载到,Centos 7 我给大家整理了一个下载链接 https://archive.kernel.org/centos-vault/ Centos 直达即可。

另外,网上关于虚拟机安装配置的介绍数不胜数,这里我就不再过多的介绍安装过程,可以参考一下这篇。

https://www.cnblogs.com/tanghaorong/p/13210794.html

配置完成之后需要设置一下桥接模式,关于桥接模式的设置可以参考这篇 。

https://www.cnblogs.com/DJOSIMON/p/14927176.html

配置完成后我们就可以通过 xshell 连接到本地 Linux 服务器了。xshell 和 xftp 我是直接用的学生版,下载省事而且功能和商业版没区别。

自己搭建完服务器之后,我们就可以尝试着在 Linux 下先把这个 TinyHttpd 源码跑起来再研究其内部逻辑。clone 完整个项目后的项目框架如下,其中的 httpd.c 就是这个 HTTP 服务器的完整代码逻辑。

通过 xftp 或者 rz 把整个 TinyHttpd tar 包放在 Linux 服务器上,对其进行解压,我们vi httpd.c 后可以发现,David 已经把 TinyHttpd 在 Linux 下的编译方式给我们写清楚了。

要在 Linux 下编译这个 TinyHttpd 项目,需要注释掉下面几段代码:

  1. 注释掉 #include <pthread.h> ,如下所示

  1. 注释掉定义在 newthread 变量的位置,在 main 函数中,如下所示

  1. 注释掉运行运行 pthread_create() 的位置,如下图所示

  1. 把注释掉的 accept_request(client_socket) 函数放开

  1. 移除 Makefile 中的 -lsocket 选项,如下图所示

如果你按照上图这样把相应的代码注释掉并且放开的话,那么代码准备工作就做完了,现在我们可以尝试编译一把 httpd.c文件了。

在 Linux 下使用 Make 进行编译,编译过程中可能会出现问题,比如让你安装 gcc 等编译工具,安装完成后再次编译会出现下面这些问题。

这些问题刚开始把我搞的有些焦躁,后来一细看这些都是 warning ,不是 error ,尝试运行一下程序发现不影响程序运行,就没有再细看这些 warning。

编译完成后会出现一个 httpd 文件,我们可以通过 ./httpd 来运行 httpd 程序,程序运行完成后会出现端口的绑定消息。

然后我们可以通过虚拟机的静态ip:端口的方式来访问 TinyHttpd 的 index.html 主页,如下图所示。

这个理想的情况是,输入一个颜色之后,点击提交页面会变更为你想要的颜色,但是我输入一个颜色比如 red 后,点击提交,页面会直接显示一个白色页面。

我查 www.baidu.com 查了好久没有找到一篇靠谱的博文,排名靠前的都是千篇一律没什么借鉴意义的词条。这里推荐大家有条件的直接挂 tz ,没有的上 biying 也可以。

我是在 biying 上找到了一篇解决办法。

首先,我们先需要安装一下 PerlPerl-CGI ,没有这俩的话,那你 CGI 就是无法展示。这在 github 上也有详细的说明。

直接使用下面命令安装即可(其他 Linux 发行版的操作系统可能不适用,需要找对应的操作系统安装命令行进行安装)

yum install perl
yum install perl-cgi

安装完成后会有 Complete! 的提示,同时我们需要知道你的 perl 安装命令,可以使用

which perl

来查询。

我们需要进入到 htdocs 中,给 color.cgi 和 index.html 分别赋权限。

chmod -R 777 color.cgi
chmod -R 666 index.html

然后我们进入到 color.cgi 中,把开头中的 perl 安装位置改为你安装 perl 的位置,如下图所示

保存之后,重新回到上层目录,输入 ./httpd 之后,就可以看到主页点击提交颜色之后对应的颜色变化了。

后面我们就开始研究一下这个 httpd 项目了。

原文链接:小而美的项目

欢迎大家关注我的个人公众号:程序员cxuan

一个小而美的 C 语言项目的更多相关文章

  1. Go语言项目的错误和异常管理 via 达达

    Go语言项目的错误和异常管理 最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享. 首先我 ...

  2. VS2012编写C语言项目

    原文:VS2012编写C语言项目 这两天看了一下C语言方面的知识,大学的时候使用的Turbo C对于我来说已经是很久之前的事情了,编写C语言的还有VC++,不过这货在64的表现实现是很让人失望,还是用 ...

  3. 基于jenkins的go语言项目自动化发布遇到的坑

    之前我们研究dep,就是为了有一天可以实现go语言项目在我们系统里的CI. 之前联物科技的项目主要是使用java作为后端开发语言,基于jenkins的自动发布,使用了pipeline编写脚本,从拉取代 ...

  4. ASP.NET Core Web多语言项目

    公司效益好了,准备和国外做生意,这个时候就需要多语言了. > 1. 这是一个ASP.NET Core Web多语言项目,主要展示项目的不同: > 2. 第一种:www.xxx.com/en ...

  5. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  6. C语言项目:学生成绩管理系统

    C语言项目:学生成绩管理系统    1.数据结构:学生信息:学号.姓名.年龄.性别.3课成绩    2.功能:   (1)增加学生记录    (2)  删除学生记录    (3)  查找学生信息(学号 ...

  7. 如何使用visual studio 2017创建C语言项目

    使用visual studio 2017创建一个C语言项目,步骤如下: (1)打开Visual Studio 2017环境后出现欢迎界面,如图1所示. 图1  Visual Studio 2017欢迎 ...

  8. Lua 是一个小巧的脚本语言

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  9. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案--temp

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  10. Go语言项目中使用zap日志库(翻译)

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...

随机推荐

  1. PHP + ELK实现日志记录

    一个简单的PHP 文件 效果 full.conf文件 流程: 开启logstash服务之后. 在业务代码里面操作函数写入日志.log logstash通过实践戳获取到用户的变更,取出最后一行数据,发送 ...

  2. Vue学习之--------组件的基本使用(非单文件组件)(代码实现)(2022/7/22)

    文章目录 1.为啥要使用组件 2.基本使用 3.代码实例 4.测试效果 5.注意点 1.为啥要使用组件 好用啊.像堆积木一样 2.基本使用 Vue中使用组件的三大步骤: 一.定义组件(创建组件) 二. ...

  3. 在CentOs7虚拟机Linux离线安装mysql5.6(亲测可用)

    在该博主博客的的基础上进一步改进:https://blog.csdn.net/zhousq8929/article/details/117223255 文章目录 1.在官网下载mysql-5.6.36 ...

  4. 39.BasicAuthentication认证

    BasicAuthentication认证介绍 BasicAuthentication使用HTTP基本的认证机制 通过用户名/密码的方式验证,通常用于测试工作,尽量不要线上使用 用户名和密码必须在HT ...

  5. Linux网络管理命令

    Linux网络管理命令 ifconfig 用于配置网卡ip地址信息等网络参数或显示网络接口状态,类似于windows的ipconfig命令. 可以用这个工具来临时性的配置网卡的IP地址.掩码.广播地址 ...

  6. flutter 系列之:flutter 中的幽灵offstage

    目录 简介 Offstage详解 Offstage的使用 总结 简介 我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件 ...

  7. Codeforces Round #809 (Div. 2)C.Qpwoeirut And The City

    题目大意: 当一栋楼比旁边两栋楼都高的时候,这栋楼为cool,对除了1和n以外的所有楼可以增加任意层,问在满足使最多的楼cool的前提下的花费最小. 当n为奇数的情况下: cool的楼实际上是固定的, ...

  8. JS图片放大镜功能实现

    JS图片放大镜功能实现 技术关键点 1.左侧和上侧距离,在一个水平位置和垂直位置中有我们可以挪动的区域,就是原图片区域,鼠标挪动位置是一个块状位置,他的左侧和上侧距离浏览器上侧和左侧分别有一个长度,我 ...

  9. C++ using 编译指令与名称冲突

    using 编译指令:它由名称空间名和它前面的关键字 using namespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符.在全局声明区域中使用 using 编译指令,将 ...

  10. 如何发布一个 TypeScript 编写的 npm 包

    前言 在这篇文章中,我们将使用TypeScript和Jest从头开始构建和发布一个NPM包. 我们将初始化一个项目,设置TypeScript,用Jest编写测试,并将其发布到NPM. 项目 我们的库称 ...