测试环境:Ubuntu 14.04.2
由于服务器不是默认为linux开发的,所以需要经过简单的修改才能在linux上运行起来。
1、修改Makefile文件,将gcc -W -Wall -lsocket -lpthread -o httpd httpd.c
修改为:gcc -W -Wall -o httpd httpd.c -lpthread。(删除-lsocket,linux下不需要 -lsocket。将-lphtread放到最后,在网上查找得到的结果是-lphtread不能放在 -o 前面,具体原因目前未知)
其实在源代码httpd.c里面,介绍了在linux系统上编译时,需要修改的地方,(还是要仔细阅读源代码)。
2、htdocs文件夹下,有两个cgi脚本文件,用于此服务器的响应,用perl语言编写,由于机器默认perl安装位置不同,所以需要修改为本机的perl地址。
经过两处修改,make 后, 服务器即可成功搭建起来。
服务器有三种交互方式:
1、直接输入ip:port地址,服务器打开存在htdocs文件夹下的index.html文件,在输入框内输入一种颜色,如red或0 0 0 ,index.html调用color.cgi脚本,显示该颜色。
2、可直接访问htdocs文件夹下脚本,如ip:port/color.cgi,默认为蓝色,或另一个脚本文件ip:port/check.cgi。
3、可直接访问htdocs文件夹下文件,如ip:port/README,将打印该文件。
总结:
1、name.sin_port = htons(*port)
此处若*port为0,则系统会随机分配端口号
2、name.sin_addr.s_addr = htonl(INADDR_ANY);
INADDR_ANY:此处表示任意IP地址,若服务器有多块网卡,多个IP地址,通过几个IP地址+端口均可访问服务器
3、newline 即 linefeed: 换行符 LF \n 换到下一行的当前列
carriage return 回车符 CR \r 回到当前行的起始位置
4、strcasecmp忽略大小写比较字符串是否相等,isspace判断字符是否为空字符,为空则返回true
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
访问服务器—GET方式:
------------------------------------------------------------------------------------------------------------------------------------------------------------------
有几个问题问下楼主:
1. 你是与 tinyhttpd 一样使用线程模型的吗?你有考虑或者测试过某个线程异常退出然后会发生什么吗?
2. 如果 client 端大量连接你的 server,只连接不通信,你的 server 会不停地创建新的线程响应新的连接吗?
3. http/0.9、http/1.0、http/1.1 请求是否都能得到正确的返回?http/1.1 中的 expect 请求呢?chunck?gzip?是否都可以得到正确的返回?是否支持 https?
4. 如果 CGI 执行时间过长是否会导致线程阻塞?
就是因为在linux环境下一个线程异常退出,整个进程都会退出,所以 nginx 和 Apache 才都使用进程模型(windows 下不存在这个问题,所以windows下 Apache 使用多进程+多线程),第二个问题是同步多进程/线程模型服务器的一个问题,消耗资源大, 所以最好考虑设定最大并发数
-----------------------------------------------------------------------------------------------------------
HttpServer是基于开源项目tinyhttpd的改进版,主要会在原项目的基础上增加更多的功能,经过我近半个月不懈的编码目前第一阶段已经完成主要实现了以下功能:
- 实现-p 选项可以指定服务器侦听端口
- 实现服务器运行日志记录功能
- 限制服务器连接个数,防止服务器运行负载过大
- 根据防火墙规则限制部分IP访问
- 实现静态文件GET方法(包括HTML CSS 图片)
- 实现CGI文件GET和POST方法
- 捕获SIGINT信号,做服务器退出前的资源清理工作
第二阶段的开发计划暂定为:
- 优化各个模块功能的在各种环境下的稳定性
- 实现HttpServer以守护进程的方式运行
- 实现HTTP的长连接支持
我很希望能完成这个这个项目,更希望以社会化协作的方式完成,所以很是期待你的加入!
开源中国主页:https://git.oschina.net/vhulm/HttpServer.git
git@git.oschina.net:vhulm/HttpServer.git