先定一個(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)。