V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
whatanoob
V2EX  ›  分享创造

2k 行 c 代码实现简单 HTTP 服务器,性能炸天!

  •  
  •   whatanoob · 2018-02-08 11:48:51 +08:00 · 8737 次点击
    这是一个创建于 2261 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好吧,首先感谢你点击进来,原谅我标题党了。 小弟花了一个多月的业余时间,手撸了一个 HTTP Server,epoll 结合非阻塞 IO,多进程复用端口,性能还不错,可以算作超级乞丐版 nginx 吧。当然还有很多功能没有实现,有些重要的 HTTP 头部还不支持,反向代理功能也有待实现:)。有文档有测试,地址在 https://github.com/chendotjs/lotos,欢迎 star 和 pr,希望大家不吝赐教!

    39 条回复    2018-02-09 16:42:47 +08:00
    panda1001
        1
    panda1001  
       2018-02-08 11:51:15 +08:00 via Android
    学习一个
    choulinlin
        2
    choulinlin  
       2018-02-08 11:52:04 +08:00 via Android
    这么多脑力耗了
    目的是不是想搞大自己名气
    misaka19000
        3
    misaka19000  
       2018-02-08 11:52:20 +08:00
    想请问下楼主,如果我想要我的 C 语言水平能够看懂这个项目的代码需要什么样的学习路线呀,或者看什么书之类的,蟹蟹!!
    whatanoob
        4
    whatanoob  
    OP
       2018-02-08 11:56:25 +08:00
    @choulinlin 不是的呀,我也就一个小菜鸡,开源服务器项目那么多,我这算得上什么。做这个项目算是练练手,整合一下自己的知识,而且我在项目目的里面也提及了是为了实现本科时候的一个小愿望——写一个能用的 Web Server
    choulinlin
        5
    choulinlin  
       2018-02-08 11:56:27 +08:00 via Android
    @misaka19000
    apue 看一下
    还有就是多层指针 函数指针 结构体 联合体
    不要去搞 c 了 头发很快掉光
    除非是想在物联网嵌入式创业
    misaka19000
        6
    misaka19000  
       2018-02-08 11:59:05 +08:00 via Android
    @choulinlin 经常看好的 python 库都是用 c 语言写的,可惜 c 语言捉鸡看不懂。。。所以想好好的了解下 c 语言。。。
    nine99
        7
    nine99  
       2018-02-08 12:00:03 +08:00
    有什么用
    hei1000
        8
    hei1000  
       2018-02-08 12:10:47 +08:00
    支持,才 2000+行代码,可以看看学习学习
    402645707
        9
    402645707  
       2018-02-08 12:14:42 +08:00 via Android   ❤️ 1
    建议楼主下次直接说句求 star,省的一些人阴阳怪气的来酸,真正觉得你的代码好的不会因为你这一句不给 star,也省得人来怀疑动机
    tairan2006
        10
    tairan2006  
       2018-02-08 12:17:25 +08:00
    star 有意义么=_=
    soli
        11
    soli  
       2018-02-08 12:29:07 +08:00
    有多少个服务端程序员就有多少个 Web Server。。。
    niubee1
        12
    niubee1  
       2018-02-08 12:34:32 +08:00
    很多年前在学校论坛和人打嘴仗, 一位高人说你们这些用 C 的弱爆了, 他作为汇编党是相当的看不起, 说你们这个论坛用的 ASP, 更是弱爆了, 然后打赌他用汇编写个 Web Server, 然后等到毕业都没有哪怕一个能跑的 demo 发出来.......
    whatanoob
        13
    whatanoob  
    OP
       2018-02-08 12:42:55 +08:00
    @misaka19000 回家以后我整理一下,楼上说 apue 的,对新手可能不太友好吧
    whatanoob
        14
    whatanoob  
    OP
       2018-02-08 12:44:40 +08:00
    @niubee1 talk is cheap, show me the code, txtx
    v2lf
        15
    v2lf  
       2018-02-08 13:33:54 +08:00
    @misaka19000 有编程基础 看些书就可以直接撸了 - =
    v2lf
        16
    v2lf  
       2018-02-08 13:34:38 +08:00
    @v2lf c prime plus csapp= =
    v2lf
        17
    v2lf  
       2018-02-08 13:35:28 +08:00
    @v2lf c primer plus
    gleymonkey
        18
    gleymonkey  
       2018-02-08 13:39:22 +08:00
    看成 2 行了。。。
    shiweifu
        19
    shiweifu  
       2018-02-08 14:06:48 +08:00   ❤️ 1
    《深入理解计算机系统》最后一章就是一个 C 语言 WebServer 的实现,还实现了 CGI。不过不是 epoll 实现的,好像是 先 展示了一波 while + fork,然后改成了 select,值得学习。
    dtgio
        20
    dtgio  
       2018-02-08 14:14:23 +08:00 via iPhone
    马一个,不知道有生之年会不会回头看😂
    xwyam
        21
    xwyam  
       2018-02-08 17:40:29 +08:00 via Android   ❤️ 1
    已加星
    whatanoob
        22
    whatanoob  
    OP
       2018-02-08 17:42:07 +08:00
    @gleymonkey

    #include <stdlib.h>
    system("python2 -m SimpleHTTPServer");
    but0n
        23
    but0n  
       2018-02-08 17:52:39 +08:00 via iPhone
    https://github.com/t01y/J4F
    之前尝试过... 后来放弃了 头有点冷
    whatanoob
        24
    whatanoob  
    OP
       2018-02-08 18:17:49 +08:00   ❤️ 1
    @misaka19000 《 c 专家编程》应该可以夯实 c 基础,读起来轻松愉快,《 UULP 》作为系统调用入门,之后看《 APUE 》和《 UNP 》这种大部头会轻松一些。酷壳的文章质量很高(手机没认证,发不了链接),干货满满。我的建议就是这样啦
    whatanoob
        25
    whatanoob  
    OP
       2018-02-08 18:37:24 +08:00
    @but0n 我之前也试过,现在头上已经凉透了😂
    misaka19000
        26
    misaka19000  
       2018-02-08 20:12:42 +08:00 via Android
    @whatanoob 蟹蟹
    wellsc
        27
    wellsc  
       2018-02-08 20:21:29 +08:00
    @whatanoob #22 难道不是
    ``` c
    #include <stdlib.h>
    int main() { system("python -m SimpleHTTPServer"); return 0; }
    ```
    blackjar
        28
    blackjar  
       2018-02-08 21:55:54 +08:00   ❤️ 1
    把 tinyhttpd 的线程模型改成 select/epoll 感觉可以在 600 行拿下
    gstqc
        29
    gstqc  
       2018-02-08 22:01:05 +08:00 via iPhone
    那个,我想说,nginx 调优一下,其实是远好于这个性能的……
    pkookp8
        30
    pkookp8  
       2018-02-09 00:37:41 +08:00 via Android
    棒!
    另外有个 tiny,500 行
    ytlm
        31
    ytlm  
       2018-02-09 08:48:07 +08:00
    挺好的,加油!
    zjcqoo
        32
    zjcqoo  
       2018-02-09 09:31:09 +08:00
    过去在 windows 上用 C++ 撸过一个 IOCP 的 WebServer。不过隐藏的 BUG 一大堆,完全不敢开源出去。。。
    dilu
        33
    dilu  
       2018-02-09 10:13:49 +08:00
    C 语言写的性能再不强真的就可以考虑回家开个饭店了(不想开饭店的程序员不是好的架构) 手动滑稽
    changwei
        34
    changwei  
       2018-02-09 11:04:08 +08:00 via Android
    @dilu 你也别这样说。你去看看 nginx 的源码,注意看他判断 http 请求行的 method 用的是什么方法。

    优化是无止境的,并不仅仅是语言本身。nginx 的源码在很多地方的优化达到了登峰造极的地步。比如说自己手动维护内存池分配,以及大量的宏和内联函数等等,非常适合想要学习开发高性能服务端的人去阅读。
    dilu
        35
    dilu  
       2018-02-09 11:18:59 +08:00
    @changwei 我不看我不看 又想骗我去学 C (手动滑稽)
    whatanoob
        36
    whatanoob  
    OP
       2018-02-09 11:55:34 +08:00
    @gstqc 这个是必然的哈,我这也就是搞出一个小 demo 抛砖引玉给大家看看玩玩。
    whatanoob
        37
    whatanoob  
    OP
       2018-02-09 11:56:17 +08:00
    @changwei 大神的 ID 很熟悉,记得是看大神的教程入门 vue 的,感谢~
    Geo200
        38
    Geo200  
       2018-02-09 15:11:19 +08:00 via iPhone
    @pkookp8 求 tiny 的链接
    pkookp8
        39
    pkookp8  
       2018-02-09 16:42:47 +08:00 via Android
    @Geo200 没说全,tinyhttpd,百度都能轻易找到
    另外可能你没兴趣,之前还看到过 uip 和 lwip 协议栈,也很精简
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5275 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:25 · PVG 09:25 · LAX 18:25 · JFK 21:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.