美文网首页我爱编程
自制Web服务器(1) 目标&环境&初步

自制Web服务器(1) 目标&环境&初步

作者: JianlingZhou | 来源:发表于2018-04-09 22:40 被阅读198次

    先定一个小目标

    人生在世,当一条咸鱼不好吗?

    最近不想做工程类的项目, 来做个玩具吧! 有天在看 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 中不断学习成长。

    相关文章

      网友评论

        本文标题:自制Web服务器(1) 目标&环境&初步

        本文链接:https://www.haomeiwen.com/subject/lpswhftx.html