Chinaunix

标题: 写了一个lite httpd [打印本页]

作者: redor    时间: 2007-03-26 22:48
标题: 写了一个lite httpd
我实现了一个TCP连接管理的基本库,在这基础上写了一个lite httpd,目前实现了多线程下载和断点续传功能,可以用来做下载,可以下载大于4G的文件,不过根据自己初步测试小文件干不过apache,大文件好像比她快。不过就是占CPU和内存。呵呵目前0.0.2版http://libsbase.googlecode.com/svn/trunk/0.0.2/
大概介绍一下程序结构。
libsbase 主要是一个主线程,初始化一个线程池(N个线程)。
主线程bind 、listen,新连接过来然后accpet,根据新fd 得到 (x= fd % N) 然后把新连接加入到线程x中,每个线程会有Y个connect需要维护。
每个线程维护一个event_loop(来自libevent,包括读和写)对所有连接进行读写监控,event_loop触发callback,
如果为读就调用read_handler从buffer读取数据,读取完buffer以后需要一个packet_reader执行读取包的操作(见lhttpd  packet_reader),
读取完packet以后将packet放入消息队列中,线程通过loop将消息队列消息pop出来,
然后调用对应的packet_handler处理数据包,数据包处理完以后如果需要发送数据将数据放入send_queue然后update event,
下一个event_loop就可能调用write_handler将send_queue里的数据发送出去,不是完全发出去,是一次能发多少发多少,
因为send_queue里的数据是buffer格式,可以根据每个连接的带宽最大能力的一次操作发出最大数据,
这样做的目的是为了每个连接能够”平均“使用CPU。

[ 本帖最后由 redor 于 2007-3-27 10:32 编辑 ]
作者: converse    时间: 2007-03-26 23:14
鼓励一下吧
作者: converse    时间: 2007-03-26 23:31
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

>>目前实现了多线程下载和断点续传功能
一个http服务器要做到以上这些需要怎么做?
作者: gnap    时间: 2007-03-27 00:21
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

>>目前实现了多线程下载和断点续传功能
一个http服务器要做到以上这些需要怎么做?


偶的理解是,能断点续传了。客户端就可以多线程下载了。

作者: langue    时间: 2007-03-27 05:54
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

>>目前实现了多线程下载和断点续传功能
一个http服务器要做到以上这些需要怎么做?


按照 RFC 实现就可以了。

.
作者: boxpei    时间: 2007-03-27 09:21
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

>>目前实现了多线程下载和断点续传功能
一个http服务器要做到以上这些需要怎么做?


RFC959 RESTART(REST)
作者: boxpei    时间: 2007-03-27 09:43
RFC 2045~2049
作者: redor    时间: 2007-03-27 10:10
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

>>目前实现了多线程下载和断点续传功能
一个http服务器要做到以上这些需要怎么做?

主要是range支持。
作者: redor    时间: 2007-03-27 10:14
原帖由 gnap 于 2007-3-27 00:21 发表


偶的理解是,能断点续传了。客户端就可以多线程下载了。


没错,只要你每次response头中带有 "Accept-Range: bytes"然后实现对REQUEST Range支持就可以实现了。实现4G以上文件只要把文件的大小和offset 变量类型修改为uint64_t就可以了。然后编译的时候加一个参数CPPFLAGS   = -D_FILE_OFFSET_BITS=64
作者: kof1688    时间: 2007-03-28 09:04
我一直在做,但只是实现个架子,参考一下楼主的代码,学了不小东西啦!
作者: redor    时间: 2007-03-28 10:46
原帖由 kof1688 于 2007-3-28 09:04 发表
我一直在做,但只是实现个架子,参考一下楼主的代码,学了不小东西啦!



加油,要完成的可以去看看lighttpd的代码,我的架构跟它不太一样,我把架构和协议实现分开了,我还没实现POST PUT 呢,POST我想跟扩展MODULE一块实现,最后用MOD来处理POST的数据,呵呵

[ 本帖最后由 redor 于 2007-3-28 10:50 编辑 ]
作者: connet    时间: 2007-03-28 12:41
CGI 1.1 支持 ?
作者: redor    时间: 2007-03-28 16:23
原帖由 connet 于 2007-3-28 12:41 发表
CGI 1.1 支持 ?


好像不难吧。。。。呵呵
作者: neoedmund    时间: 2007-03-29 10:17
how about lighttpd
作者: redor    时间: 2007-03-29 11:42
原帖由 neoedmund 于 2007-3-29 10:17 发表
how about lighttpd


google it , It is a light httpd with high performance.
作者: arenxl    时间: 2007-03-29 13:02
菜鸟我下下来研究一下
作者: cofish    时间: 2007-03-30 10:53
支持一个




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2