自制Web服務(wù)器(1) 目標(biāo)&環(huán)境&初步

先定一個(gè)小目標(biāo)

人生在世,當(dāng)一條咸魚不好嗎?

最近不想做工程類的項(xiàng)目, 來做個(gè)玩具吧! 有天在看 CMU 的課程列表, 然后搜索了一下知乎上對(duì)CMU的課程的評(píng)價(jià),發(fā)現(xiàn)還是國(guó)外大學(xué)的培養(yǎng)牛。像計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)這樣的 CS 核心課程,雖然學(xué)校的大作業(yè)/課程設(shè)計(jì)/Project做的都是玩具,但是國(guó)外做的至少是真實(shí)的玩具,重大的要求只是用程序來模擬協(xié)議或經(jīng)典算法。

啊啊啊,我也想做真實(shí)的玩具。

首先定一個(gè)小目標(biāo),CMU CS-15-441/641 Project 1

A Web Server Called Liso

要求的 pdf 文件網(wǎng)上可以搜到,大概放一下要求的概述:


需要用 UNIX的 Socket API 寫一個(gè) Web服務(wù)器(使用 C 語言開發(fā)),可以接受來自客戶端的 GET POST 等請(qǐng)求,使用 lex 和 bison 解析HTTP包,之后要支持 HTTPS,使用Linux多路復(fù)用的api 來實(shí)現(xiàn)并發(fā)。 很多名詞都不懂,看來得好好學(xué)習(xí)一波。 這下可以訓(xùn)練一下自己在 C 語言, UNIX 網(wǎng)絡(luò)編程, 編譯原理, Web 協(xié)議等方面的熟練度了。

準(zhǔn)備

之前寫過一點(diǎn)點(diǎn) C語言的玩具,但是 Makefile 規(guī)則還不是很熟。這次并不想寫 Makefile,現(xiàn)在大家應(yīng)該都用 cmake 生成 Makefile 了。只要寫好 CMakeLIst.txt,運(yùn)行一下 cmake . 就行了。

關(guān)于開發(fā)環(huán)境,一開始想在 WIndows 下開發(fā),后來發(fā)現(xiàn)是癡人說夢(mèng),那玩意非得在 Linux 下調(diào)試才行,每次 add -> commit -> push -> ssh到服務(wù)器 -> make -> run,那我可能是瘋了。所以得搞個(gè)虛擬機(jī)!好!Oracle VIrtualBox! 媽蛋!筆記本性能似乎跟不上?好,用實(shí)驗(yàn)室的工作站吧~

結(jié)果那臺(tái)很久沒用的工作站又出各種問題,顯卡沒插好,視頻信號(hào)出不來,害的師兄們幫我調(diào)了好久。最后老的Ubuntu 14.04 圖形界面也掛了,沒辦法,又刻錄了個(gè) Ubuntu 16.04 的啟動(dòng)盤。真是一波三折,換在大三的話我早就放棄了,現(xiàn)在踩過的坑多了,真的無所謂了。

關(guān)于 IDE,一開始想過用 CLion,后來覺得有點(diǎn)小題大做了,這次想配置個(gè)輕量級(jí)的環(huán)境,用 Visual Studio Code。插件只裝了兩個(gè): Vim 和 C/C++。微軟官方的 C/C++ 插件其實(shí)挺好用的,就是 CPU 燒的厲害,不過對(duì)于這個(gè)24核的工作站不是問題(對(duì)于我的筆記本就很吃力了)。

然后 CMakeLists.txt 規(guī)則如下:

cmake_minimum_required(VERSION 3.5)
project(liso)

set(CMAKE_C_STANDARD 99)
set(CMAKE_BUILD_TYPE Debug)
set(SOURCE_FILES main.c )
add_executable(liso ${SOURCE_FILES})

特意加上了 set(CMAKE_BUILD_TYPE Debug) ,不然輸出的程序是沒有 gdb符號(hào)的,這樣 gdb掛不上去就沒法調(diào)試了。 后面運(yùn)行 cmake . 就可以生成 Makefile 了, 再跑個(gè) make 就可以生成程序了。至于 -Wall 等東西,之后慢慢加吧。

./vscode 下的調(diào)試配置如下:

{
    
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/liso",
            "args": ["-p 80"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

整個(gè)開發(fā)環(huán)境長(zhǎng)這樣:


已經(jīng)做的工作

使用了 argp 這個(gè)庫做命令行參數(shù)解析,一些用法還沒有完全搞清楚。
然后在看 《UNIX網(wǎng)絡(luò)編程 第一卷》,學(xué)習(xí)了一些套接字的接口用法。

項(xiàng)目代碼已經(jīng)放到 GIthub 上了: https://github.com/Jimmie00x0000/liso
現(xiàn)在的代碼很稚嫩,希望可以在一個(gè)個(gè) commit 中不斷學(xué)習(xí)成長(zhǎng)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容