一个简单的 Web 服务器 [未完成]
最近学习C++,linux和网络编程,想做个小(mini)项目. 就去搜索引擎, 开源中国, Sourceforge上找http server的项目.
好吧,也去了知乎. 知乎上程序员氛围好, 有不少经验可以借鉴.
终极目标:自己实现(implement)一个WEB SERVER.
感想: 算法和数据结构还是很重要的...(一切的基础啊...悔不当初为什么不好好学,去acm也好...)
指导:Build a simple HTTP server in C (有不会的就问stackoverflow, 所以说如果有一天这网站挂了,网站管理员都不会修了,因为没有可以问啊)
资料:
0.RFC1945:Hypertext Transfer Protocol -- HTTP/1.0 (http协议版本1.0)
1.RFC2616: rfc2616 Hypertext Transfer Protocol -- HTTP/1.1 (讲HTTP协议,版本1.1,114页大小)
2.A Practical Guide to Writing Clients and Servers (15页打印纸的内容,略长略长,慢慢看)
比RFC容易看,快速过一遍.
3.RFC2396:
4.RFC2732:
5.RFC822: Standard for ARPA Internet Text Messages
6.RFC1521:MIME part I
前导知识 prerequisites:
0.网络知识 (看TCP/IP Illustrated)
1.网络编程 (可以看UNP, Unix Network Programming)
(或者更好入门的Beej's Guide to Network Programming)
2.系统API (看APUE, Advanced Programming in the UNIX Environment Third Edition)
(书厚不是问题,反正以后都要看,早点看得了)
找到几个轻量级的小项目:
1.nweb Tiny Webserver (谷歌搜出来的, 200行,静态网页,C,安全检查)
比较简单,如果有点网络编程的基础的话,就是刚学完网络编程就能写出来的程度.
用fork(),不用select(). 看完后可以用select做一次. 代码中用了signal(),inet_addr()这些不推荐的函数. 可以自己替代为sigaction()和inet_aton()
如何写一个daemon :Linux Daemon Writing HOWTO
我犯过的错误:
1. if(a=b)
2.accept()调用时没有初始化socklen_t addrlen = sizeof client_addr;
3.发送图片时没有写头部 Content-Type: image/jpg
4. 使用sprintf时没有使格式和参数一一对应,导致未定义的结果.
5. 调用select()时没有注意nfds要加1
6.如果要用ipv6,似乎不能用sa->ai_family = AF_UNSPEC;而只能用AF_INET6;不然问题提示"Connection refused"
7.getaddrinfo()返回0是成功. 非0为失败(而还是-1!!!!!!)
2.Tiny HTTPd (stackoverflow上有人推荐,500 行,C,支持CGI)
(CSDN上有人解析源码: 【源码剖析】tinyhttpd —— C 语言实现最简单的 HTTP 服务器)
3.mongoose (知乎上一个问题下说到了)
4.lighthttpd (轻量级,高性能网站,安全、快速、兼容性好并且灵活的web server环境)
(ChinaUNIX 的 lighttpd-1.4.20源码分析 )
5.Zaver如何写一个Web服务器 github:zyearn/zaver (知乎上看到的, 高性能, http/1.1, 基本架构 : 非阻塞, event loop, 线程池)
6.Nginx (生产环境. 不知道为什么我会把这个放在这里,装饰下页面......应该不会去看的)
测试:
1. 压力测试
http_load
webbench
ab
还有一个问题,阅读别人的代码:
1.书:Code Reading
Further Study:
the c10k problem (10,000 connection)
一个简单的 Web 服务器 [未完成]的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 一个简单的web服务器
写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- 利用 nodeJS 搭建一个简单的Web服务器(转)
下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...
- 《深度解析Tomcat》 第一章 一个简单的Web服务器
本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...
- 一个简单的Web服务器-支持Servlet请求
上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...
- 一个简单的Web服务器-支持静态资源请求
目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...
随机推荐
- 【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
前言 API 不熟悉导致的问题,想当然的去理解果然会出问题,这里记录一下 UICollectionView 使用问题. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cn ...
- 纯js实现10分钟倒计时
一个简单实现倒计时的小栗子~ 效果图:简陋的不能再简陋了,捂脸 代码: <!DOCTYPE HTML> <html> <head> <title> 倒计 ...
- SQL Server 2008 R2——当前日期下,一年前数据的统计值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- java 线程池——异步任务
一.简单粗暴的线程 最原始的方式,当我们要并行的或者异步的执行一个任务的时候,我们会直接使用启动一个线程的方式,如下面所示: new Thread(new Runnable() { @Override ...
- 项目vue2.0仿外卖APP(七)
ratings评价列表页实现 在ratings.vue组件里开发 首先先引入seller数据: 书写模板结构: 由于评价页又有之前写过的star.vue组件,所以又要在ratings.vue组件引入: ...
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- [LeetCode] Nested List Weight Sum 嵌套链表权重和
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...
- Gulp 入门
1. 安装 Node 环境 参考 http://www.cnblogs.com/zichi/p/4627728.html,注意一起安装 npm 工具,并把路径保存到环境变量中(安装过程中会有提醒) 安 ...
- echart折线图小知识
1)在折线图中,有时我们不想让太多折线显示,那么就隐藏,点击legend区域文字再显示. 比如我们要隐藏的折线叫"联盟广告",代码如下 var selected = {}; sel ...
- nginx 虚拟主机配置
user nginx; #代表使用的用户 worker_processes auto; #工作衍生进程数,一般代表系统cpu核数一到两倍最好 error_log /var/log/nginx/erro ...