分享个简易 HTTP 服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
perapera
V2EX    程序员

分享个简易 HTTP 服务器

  •  3
     
  •   perapera 2021-01-05 11:36:24 +08:00 3603 次点击
    这是一个创建于 1795 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,最近小弟在学习 Socket,受到 CapriccioC10k 启发,又刚好遇到 Zaver 作者写的这篇博文,就想着看看能不能仿照 Zaver 然后改用协程(?)为我自己的单核服务器写一个单线程的 HTTP 服务器程序来练练手,从汇编实现到直接用库都试了一下,后来发现如果限制在一个线程的话,协程的意义也不大,于是就直接放弃了使用协程的想法,只是把书上(主要是 Linux/UNIX 系统编程手册)推荐的一些调度方法实现了一下,希望能通过尽量减少 blocking 操作来达到差不多的效果,然后就有了这个非常基础、简单的服务器,cherry

    其实如果说 HTTP 服务器实现的话,GitHub 上真是多如牛毛,cherry 也没什么太多值得分享的地方,按理说就该放在一边吃灰的,但我转念一想,正是因为 cherry 没有什么太高深的地方,是一个仅仅以书本知识为基础写出来的,刚刚好能运行的 HTTP 服务器,某些层面上来说,如果有谁也恰好在看 CS:APP,编程手册,UNIX 网络编程之类的书的话,cherry 如今正好就像是一个课后作业,于是就抱着「可能有人想看一下我的作业」的心态就在这里分享出来了,哈哈。日后的话,我可能更多地会把这个项目当成一个模板,所以也不会在 cherry 里添加太复杂的内容,只在原有的基础上实现一些比较容易的想法,比如换一下数据结构,支持一下配置文档或者 kqueue 之类,如果有兴趣(<del>找 bug</del>)的话可以移步 README ~

    GitHub 地址: https://github.com/ahhzee/cherry

    img (以上是 ApacheBench 的分析结果)

    6 条回复    2021-01-06 09:24:32 +08:00
    vus520
        1
    vus520  
       2021-01-05 12:20:57 +08:00   1
    已点
    iplayio2019
        2
    iplayio2019  
       2021-01-05 15:53:51 +08:00
    用 PHP 也可以写一个 HTTP 服务器。
    oxromantic
        3
    oxromantic  
       2021-01-05 16:58:15 +08:00   1
    简单看了下代码,说下自己的看法吧

    https://github.com/ahhzee/cherry/blob/master/src/http.c

    1. request io 读出错就调用 exit,看起来只要有个请求数据不正常就会触发闪退,不知道我理解是否正确
    2. http 协议还是优先实现 1.0 的好,毕竟简单
    3. mime 有很多现有的映射规则,建议做成外部配置
    4. 粗看现在的模型是如果一个网速极慢或者为 0 的客户端下载文件,那么在他下载完成之前,其他客户端都不会得到 cpu 时间,不知是否如此
    perapera
        4
    perapera  
    OP
       2021-01-05 19:53:51 +08:00
    @oxromantic

    1: 谢谢指点!确实,请求处理部分真的十分粗陋,目前能处理的错误只有 EAGAIN,我自己也试过一两次因为读取错误而整个程序直接退出,加上我这一部分没用 perror,导致我连错误是什么都不知道,不过笼统改为无视这些错误意义好像也不大,改天应该会将这一部分代码重写一遍。

    2 、3: 好建议,我会试一下

    4: 个人理解不会,现在处理请求的流程主要是逐一从队列里拉取已有的连接描述符,再逐一读取该连接已有的请求并发送相应文件(这些地方倒是可能造成阻塞),并且 socket 全部都设为非阻塞,就 IO 方面好像没有哪个函数会受制于对方接收速度,但确实有漏发的可能,因为现在对于写操作 EAGAIN 的解决方法只是单纯无视而已 =_= 说到头来还是请求处理的问题……
    cz5424
        5
    cz5424  
       2021-01-06 06:57:54 +08:00 via iPhone   1
    楼主代码里面的 jpeg 打错了
    perapera
        6
    perapera  
    OP
       2021-01-06 09:24:32 +08:00
    @cz5424 谢谢指正!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5137 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:01 PVG 14:01 LAX 22:01 JFK 01:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86