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下載頁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章