最近学习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. MYSQL基础操作之数据约束与关联查询

    一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...

  2. 安装.NET Framework进度条卡住不动的解决方案

    VS在安装之前需要安装.NET Framework,我安装的是4.0版本.但是安装进度条到一半左右时就卡住不动了.前前后后重试多次,还有几次重新开机,但都没用. 开始还以为是安装的系统有问题.后来在网 ...

  3. NFS服务器搭建——可用于共享文件或负载均衡文件共享服务器使用

    一.软件包安装 yum -y install nfs-utils  rpcbind 二.服务器端配置共享目录 1. 在服务器上创建NFS共享目录:mkdir /usr/local/test 2. 设置 ...

  4. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  5. SQL*Plus环境下创建PLUSTRACE角色

    普通用户在SQL*Plus中开启AUTOTRACE报告时,遇到SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is ...

  6. LVM 管理减少swap分区空间增加到根分区

    简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...

  7. Mysql 的特殊之处

    互联网公司一般都会选择在互联网得到广泛应用的Mysql,但之前一直用微软的东东,包括数据库(MS SQLServer). 这不本以为切换数据库so easy,但是还是有些细节需要注意. 数据类型 Da ...

  8. 图像处理中任意核卷积(matlab中conv2函数)的快速实现。

    卷积其实是图像处理中最基本的操作,我们常见的一些算法比如:均值模糊.高斯模糊.锐化.Sobel.拉普拉斯.prewitt边缘检测等等一些和领域相关的算法,都可以通过卷积算法实现.只不过由于这些算法的卷 ...

  9. Linux计划任务.md

    crond crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程 ...

  10. webstorm对WebGL自动提示

    默认竟然没有勾选上,怪不得提示的时候,有很多webgl接口找不到方法(虽然可以运行).