一個小而美的 C 語言專案

程式設計師cxuan發表於2023-01-12

我最近在學習 C 語言,看的一本書叫做 《C Primer Plus》,這本書對 C 語言的描寫、特性介紹、程式碼示例都介紹的比較詳細,是小白入門 C 語言非常不錯的一本書,還有一本經典書叫做《C 程式設計語言》,這本書可以作為 《C Primer Plus》下一步要解鎖的成就。

那麼只是看書學習是不夠的,還需要學習別人寫的優秀程式碼,汲取優秀的程式碼邏輯和程式設計正規化,並把他融入到自己的血液中,才能在程式設計這條路上不斷進步。

最近接觸到了一個叫做 tinyhttpd 的專案,這個專案想必大家學 C 的應該都聽過,這是 J. David Blackstone 在 1999 年寫的一個小型 HTTP 伺服器的專案,用來學習非常不錯,可以幫助我們真正理解伺服器程式的本質以及 HTTP 的請求響應過程。大家可以去官網下載這個專案 http://tinyhttpd.sourceforge.net

當然,也有同學 fork 了這個專案,大家也可以在 https://github.com/EZLippi/Tinyhttpd 直接 fork 或者 clone。

我最近抽空也是把這個專案跑起來並研究了一下。

本地自己搭了一臺伺服器,用的是 vmvare 和 Centos 7 ,vmvare 可以隨處下載到,Centos 7 我給大家整理了一個下載連結 https://archive.kernel.org/centos-vault/ Centos 直達即可。

另外,網上關於虛擬機器安裝配置的介紹數不勝數,這裡我就不再過多的介紹安裝過程,可以參考一下這篇。

https://www.cnblogs.com/tanghaorong/p/13210794.html

配置完成之後需要設定一下橋接模式,關於橋接模式的設定可以參考這篇 。

https://www.cnblogs.com/DJOSIMON/p/14927176.html

配置完成後我們就可以透過 xshell 連線到本地 Linux 伺服器了。xshell 和 xftp 我是直接用的學生版,下載省事而且功能和商業版沒區別。

自己搭建完伺服器之後,我們就可以嘗試著在 Linux 下先把這個 TinyHttpd 原始碼跑起來再研究其內部邏輯。clone 完整個專案後的專案框架如下,其中的 httpd.c 就是這個 HTTP 伺服器的完整程式碼邏輯。

image-20221004090558121

透過 xftp 或者 rz 把整個 TinyHttpd tar 包放在 Linux 伺服器上,對其進行解壓,我們vi httpd.c 後可以發現,David 已經把 TinyHttpd 在 Linux 下的編譯方式給我們寫清楚了。

image-20221004153117299

要在 Linux 下編譯這個 TinyHttpd 專案,需要註釋掉下面幾段程式碼:

  1. 註釋掉 #include <pthread.h> ,如下所示

  1. 註釋掉定義在 newthread 變數的位置,在 main 函式中,如下所示

  1. 註釋掉執行執行 pthread_create() 的位置,如下圖所示

  1. 把註釋掉的 accept_request(client_socket) 函式放開

  1. 移除 Makefile 中的 -lsocket 選項,如下圖所示

如果你按照上圖這樣把相應的程式碼註釋掉並且放開的話,那麼程式碼準備工作就做完了,現在我們可以嘗試編譯一把 httpd.c檔案了。

在 Linux 下使用 Make 進行編譯,編譯過程中可能會出現問題,比如讓你安裝 gcc 等編譯工具,安裝完成後再次編譯會出現下面這些問題。

這些問題剛開始把我搞的有些焦躁,後來一細看這些都是 warning ,不是 error ,嘗試執行一下程式發現不影響程式執行,就沒有再細看這些 warning。

編譯完成後會出現一個 httpd 檔案,我們可以透過 ./httpd 來執行 httpd 程式,程式執行完成後會出現埠的繫結訊息。

然後我們可以透過虛擬機器的靜態ip:埠的方式來訪問 TinyHttpd 的 index.html 主頁,如下圖所示。

這個理想的情況是,輸入一個顏色之後,點選提交頁面會變更為你想要的顏色,但是我輸入一個顏色比如 red 後,點選提交,頁面會直接顯示一個白色頁面。

我查 www.baidu.com 查了好久沒有找到一篇靠譜的博文,排名靠前的都是千篇一律沒什麼借鑑意義的詞條。這裡推薦大家有條件的直接掛 tz ,沒有的上 biying 也可以。

我是在 biying 上找到了一篇解決辦法。

首先,我們先需要安裝一下 PerlPerl-CGI ,沒有這倆的話,那你 CGI 就是無法展示。這在 github 上也有詳細的說明。

直接使用下面命令安裝即可(其他 Linux 發行版的作業系統可能不適用,需要找對應的作業系統安裝命令列進行安裝)

yum install perl
yum install perl-cgi

安裝完成後會有 Complete! 的提示,同時我們需要知道你的 perl 安裝命令,可以使用

which perl

來查詢。

我們需要進入到 htdocs 中,給 color.cgi 和 index.html 分別賦許可權。

chmod -R 777 color.cgi 
chmod -R 666 index.html 

然後我們進入到 color.cgi 中,把開頭中的 perl 安裝位置改為你安裝 perl 的位置,如下圖所示

儲存之後,重新回到上層目錄,輸入 ./httpd 之後,就可以看到主頁點選提交顏色之後對應的顏色變化了。

後面我們就開始研究一下這個 httpd 專案了。

原文連結:小而美的專案

歡迎大家關注我的個人公眾號:程式設計師cxuan

相關文章