TINY Web服务器实例源代码(参考《深入理解计算机系统(第二版)》)

TINY Web服务器实例源代码(参考《深入理解计算机系统(第二版)》)

笔者参考《深入理解计算机系统(第二版)》中11.6节的内容实现了这个TINY Web服务器程序(本文末尾提供全部源代码下载)。源代码主要来自该书提供的参考代码,笔者针对实际调试中的问题进行了少量修改。代码经过测试,可以实现相应的功能。笔者的测试环境如下:

操作系统:CentOS 7
编译器:g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)

TINY是一个迭代服务器,执行典型的无限循环服务器循环,不断监听在命令行中传递来的端口上的连接请求,处理一个HTTP事务,并关闭连接它的那一端。
注意,TINY只支持HTTP的GET方法。如果客户端请求其他方法(比如POST),TINY会给它发送一个错误信息,并返回到主程序,主程序随后关闭连接并等待下一个连接请求。否则,读并且(像我们将要看到的那样)忽略任何请求报头。

下面展示程序的使用方法和实际效果:

首先,复制源代码到linux系统中,进入tiny目录,编译源程序:

g++ -o tiny tiny.c csapp.c -w -lpthread

添加-w(小写)选项是为了避免显示警告(主要来自《深入理解计算机系统》一书提供的源代码),-lpthread是因为该书提供的csapp.c文件中包含关于POSIX线程库函数的使用。
然后,运行编译生成的tiny程序,并指定服务器绑定的端口号(如8888):

./tiny 8888

在本机再打开一个命令行终端,使用telnet命令连接到服务器:

telnet 127.0.0.1 8888

终端上显示如下信息,说明连接成功:

Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.

  1. 请求静态内容

在终端输入HTTP请求:

GET / HTTP

上面的命令为一个请求行,其一般形式为:
<method><uri><version>

输入完成回车换行后,再回车换行输入一个空行,表示终止报头列表。
此时,服务器会返回如下HTTP响应,包括一个响应行(HTTP/1.0 200 OK),后面跟随零个或多个响应报头,再跟随一个终止报头的空行,最后跟随一个响应主体,这里即tiny文件夹中的home.html文件中的内容,最后服务器主动关闭连接:

HTTP/1.0 200 OK
Server: Tiny Web Server
Content-length: 248
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>HomePage</title>
</head><body>
<h1>HomePage</h1>
<p>Welcome to our HomePage.<br />
</p>
<hr>
<address>Apache Server at ip-127-0-0-1 Port 2000</address>
</body></html>
Connection closed by foreign host.

2.请求动态内容
首先需要将服务器文件夹cgi-add中的程序adder.c进行编译:

g++ adder.c -o adder

adder属于一个CGI(Common Gateway Interface,通用网关接口)程序,当客户端请求执行相应的可执行程序(如adder)时,通过URI(Uniform Resource Identifier,统一资源标识符)向程序传入参数。可执行文件运行产生的输出即为动态内容。服务器程序通过创建子进程运行CGI程序,并将其输出返回给客户端。
对于请求动态内容,客户端的请求如下:

GET /cgi-bin/adder?1500&213 HTTP

同样,在命令之后要在输入一个空行终止报头列表。该命令表示请求/cgi-bin/adder程序,并传入两个参数1500、213。
服务器返回的信息如下:

HTTP/1.0 200 OK
Server: Tiny Web Server
Content-length: 113
Content-type: text/html

Welcome to add.com: THE Internet addition portal.
<p>The answer is: 1500 + 213 = 1713
<p>Thanks for visiting!
Connection closed by foreign host.

可以看出服务器调用了adder,计算并返回了两个参数的和,完成了加法计算。

源代码获取请点击下面的GitHub链接:
TINY Web服务器GitHub下载页

C语言实现的支持高并发、超高性能Web服务器源码,可以编译运行,使用高性能HTTP解析器fasterhttp作为其解析核心,在开启Keep-Alive和gzip压缩时(现代浏览器默认开启)性能比nginx约快3倍。 hetao功能: * 支持主流操作系统Linux(基于epoll)、WINDOWS(基于IOCP,暂不支持HTTPS) * 支持HTTP/1.0、HTTP/1.1 * 支持通讯超时控制 * 支持多侦听端口 * 支持多虚拟主机(基于域名) * 支持自定义错误页面 * 支持自定义缺省index文件 * 支持自适应Keep-Alive * 支持自适应gzip、deflate压缩 * 支持HTTPS * 支持反向代理负载均衡(目前支持轮询、最少 连接数算法),支持HTTPHTTPS互转 * 支持rewrite * 支持优雅重启/重载配置,重启期间完全不中断对外服务 * 支持工作进程绑定CPU * 支持进程 崩溃后自动重启安全机制: * HTTP请求报文合法性校验 * 活跃超时控制(防止僵尸连接)和累积超时控制(防止慢速攻击) * 每个IP连接数 限制 * 全局最大连接数限制 * 最大单个文件缓存大小 选择hetao的理由: *在Linux上的综合性能约比Nginx还要快三倍,尤其适合中小型静 态文件 * hetao是众多开源Web服务器中在WINDOWS版本唯一全部采用IOCP模型。Apache的WINDOWS版本是传统的Leader-Follow多进程模型,Nginx则 是多线程select模型(玩具?) * 配置文件采用JSON标准格式,简洁易写,而且支持行注释和块注释。Apache配置格式比较复杂,Nginx配置 格式多变怪异且不支持块注释 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值