先定一个小目标
人生在世,当一条咸鱼不好吗?
最近不想做工程类的项目, 来做个玩具吧! 有天在看 CMU 的课程列表, 然后搜索了一下知乎上对CMU的课程的评价,发现还是国外大学的培养牛。像计算机网络、操作系统这样的 CS 核心课程,虽然学校的大作业/课程设计/Project做的都是玩具,但是国外做的至少是真实的玩具,重大的要求只是用程序来模拟协议或经典算法。
啊啊啊,我也想做真实的玩具。
首先定一个小目标,CMU CS-15-441/641 Project 1
A Web Server Called Liso
要求的 pdf 文件网上可以搜到,大概放一下要求的概述:
需要用 UNIX的 Socket API 写一个 Web服务器(使用 C 语言开发),可以接受来自客户端的 GET POST 等请求,使用 lex 和 bison 解析HTTP包,之后要支持 HTTPS,使用Linux多路复用的api 来实现并发。 很多名词都不懂,看来得好好学习一波。 这下可以训练一下自己在 C 语言, UNIX 网络编程, 编译原理, Web 协议等方面的熟练度了。
准备
之前写过一点点 C语言的玩具,但是 Makefile 规则还不是很熟。这次并不想写 Makefile,现在大家应该都用 cmake 生成 Makefile 了。只要写好 CMakeLIst.txt,运行一下 cmake . 就行了。
关于开发环境,一开始想在 WIndows 下开发,后来发现是痴人说梦,那玩意非得在 Linux 下调试才行,每次 add -> commit -> push -> ssh到服务器 -> make -> run,那我可能是疯了。所以得搞个虚拟机!好!Oracle VIrtualBox! 妈蛋!笔记本性能似乎跟不上?好,用实验室的工作站吧~
结果那台很久没用的工作站又出各种问题,显卡没插好,视频信号出不来,害的师兄们帮我调了好久。最后老的Ubuntu 14.04 图形界面也挂了,没办法,又刻录了个 Ubuntu 16.04 的启动盘。真是一波三折,换在大三的话我早就放弃了,现在踩过的坑多了,真的无所谓了。
关于 IDE,一开始想过用 CLion,后来觉得有点小题大做了,这次想配置个轻量级的环境,用 Visual Studio Code。插件只装了两个: Vim 和 C/C++。微软官方的 C/C++ 插件其实挺好用的,就是 CPU 烧的厉害,不过对于这个24核的工作站不是问题(对于我的笔记本就很吃力了)。
然后 CMakeLists.txt 规则如下:
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符号的,这样 gdb挂不上去就没法调试了。 后面运行 cmake . 就可以生成 Makefile 了, 再跑个 make 就可以生成程序了。至于 -Wall 等东西,之后慢慢加吧。
./vscode 下的调试配置如下:
{
"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
}
]
}
]
}
整个开发环境长这样:
已经做的工作
使用了 argp 这个库做命令行参数解析,一些用法还没有完全搞清楚。
然后在看 《UNIX网络编程 第一卷》,学习了一些套接字的接口用法。
项目代码已经放到 GIthub 上了: https://github.com/Jimmie00x0000/liso
现在的代码很稚嫩,希望可以在一个个 commit 中不断学习成长。