系列文章:
自己动手写http服务器(一) -- UNIX C 网络编程
自己动手写http服务器(二) -- http协议分析
自己动手写http服务器(三) -- 代码实现
有了前两篇的描述,我们就能实现一个简单的web服务器了。
效果
先来介绍一下最终的效果:
我们通过编译生成两个可执行文件: fhttpd 和 login.cgi,其中,fhttpd 是我们的web服务器软件,而 login.cgi 是用C语言编写的可执行文件,用于动态生成web页面;
开启服务器并访问的过程如下:
1、启动服务器
通过命令 ./fhttpd 端口号
指定在本机开启的web服务端口,并启动服务,如:
我们就开启了web服务,开启的端口为 8888 ;
服务器访问
在浏览器中输入 :localhost:8888
就可访问启动的服务器:
登陆
通过输入用户名和密码,服务器会校验用户是否存在,分为3种情况:
1、用户名不存在
例如,输入用户名:foolish ,密码:abc,web服务器发现找不到该用户名,则显示如下:
2、密码不正确
例如,输入用户名:admin ,密码:abc,显示如下:
3、成功登录
例如:输入用户名:admin ,密码:123456,显示如下:
源码
源码可以下载zip包,地址为:
https://github.com/foolishflyfox/fhttpd/archive/master.zip
有git的同学也可以通过git下载,使用命令:
git clone https://github.com/foolishflyfox/fhttpd.git
或
git clone git@github.com:foolishflyfox/fhttpd.git
均可下载;
在这里就不贴代码凑字数了,需要的自己下 _
说明
这里说一下代码中的几个文件的用途:
- fhttpd.c : 服务器源码
- login.c:编译出 login.cgi 的源文件
- index.html : 只在浏览器中输入 IP:端口号 将反馈该html文件;
其他的几个很好理解,不再赘述;
要编译出 fhttp 和 login.cgi ,只须执行 make
命令即可;
代码中的所有变量都用小驼峰命名法,结构体类型用大驼峰命名法,枚举类型及宏定义名全部大写;
由于代码中使用了一些 Unix/Linux 系统函数的库,所以,windows下不一定能编译通过,可以在windows下安装Cygwin 或者 在Windows的内置Linux子系统下进行编译运行;
涉及内容
虽然主要的源文件 fhttp.c 只有400行只有,但是内容并不少,主要包括:
- 网络编程(TCP)
- 多线程
- 多进程
- 管道通讯(IPC,进程间通讯的一种方式)
- 数据的重定向
- 基础C编程
应用
这样小又简单的Web服务器,对于大型的Web服务当然不能支持。但是,在某些嵌入式中,由于受制于硬件限制,也许用得到,比如,很多的路由器中,还是使用cgi提供web服务来对路由器进行配置。
建议
可以在理解的大概的思路以后,自己从零开始写一遍,而不是照抄一遍,在遇到问题时再参考代码,这样能够理解得更加深刻。
存在的问题
为了代码的简单起见,我们只是用了http协议字段中的很少很少一部分的内容,而且提供的是响应后立马断开连接的Http/1.0服务,所以,有时候会出现web页面刷新不出来情况。
如果想要大概了解一下Web服务器的工作流程,写完这个,就差不多能够达到目的了!
完