最近学习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

  2.网页:Tips For Reading Code

Further Study:

the c10k problem (10,000 connection)

一个简单的 Web 服务器 [未完成]的更多相关文章

  1. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  2. 一个简单的web服务器

    写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...

  3. [置顶] 在Ubuntu下实现一个简单的Web服务器

    要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...

  4. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  5. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  6. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  7. 《深度解析Tomcat》 第一章 一个简单的Web服务器

    本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...

  8. 一个简单的Web服务器-支持Servlet请求

    上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...

  9. 一个简单的Web服务器-支持静态资源请求

    目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...

随机推荐

  1. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  2. [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集

    虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/   ...

  3. MYSQL数据库的优化

    我们究竟应该如何对MySQL数据库进行优化?下面我就从MySQL对硬件的选择.MySQL的安装.my.cnf的优化.MySQL如何进行架构设计及数据切分等方面来说明这个问题. 服务器物理硬件的优化 在 ...

  4. linux基本知识1

    ls命令: -l:长格式 文件类型:第1位 -:普通文件 d:目录文件 b:块设备文件(block) c:字符设备文件(character) l:符号链接文件(symbolic link file) ...

  5. Installation error: INSTALL_FAILED_NO_MATCHING_ABIS

    使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法 http://www.cnblogs.com/xiaobo-Linux/ 下载地址: ...

  6. js 页面无滚动条添加滚轮事件

    当页面无滚动条时,滑动滚轮时window.onscroll事件不会相应,此时应该去添加滚轮事件 var MouseWheelHandler=function(e){ e.preventDefault( ...

  7. split和join的用法

    第一点:split 直接举例子,比较直观, >>> f = 'www.baidu.com.cn' >>> f.split()['www.baidu.com.cn'] ...

  8. 主席树——求静态区间第k大

    例题:poj2104 http://poj.org/problem?id=2104 讲解:http://blog.sina.com.cn/s/blog_6022c4720102w03t.html ht ...

  9. PIC12F508/505/509/510/506/519/526/527单片机破解芯片解密方法!

    IC芯片解密PIC12F508/505/509/510/506/519/526/527单片机破解 单片机芯片解密型号: PIC12F508解密 | PIC12F505解密 | PIC12F506解密  ...

  10. jQuery Ajax传值给Servlet,在Servlet里Get接受参数乱码的解决方法

    最近在学jquery ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如 ...