首页 > 学技术 > 技术网文 > C/C++ > 正文

[原创] 写了一个lite httpd


来源 chinaunix.net kuqin整理

我实现了一个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:55

鼓励一下吧


 converse 回复于:2007-03-26 23:31:54

稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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


 gnap 回复于:2007-03-27 00:21:25

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

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



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


 langue 回复于:2007-03-27 05:54:46

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

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



按照 RFC 实现就可以了。

.


 boxpei 回复于:2007-03-27 09:21:43

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

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



RFC959 RESTART(REST)


 boxpei 回复于:2007-03-27 09:43:54

RFC 2045~2049


 redor 回复于:2007-03-27 10:10:35

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

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


主要是range支持。


 redor 回复于:2007-03-27 10:14:33

引用:原帖由 gnap 于 2007-3-27 00:21 发表


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



没错,只要你每次response头中带有 "Accept-Range: bytes"然后实现对REQUEST Range支持就可以实现了。实现4G以上文件只要把文件的大小和offset 变量类型修改为uint64_t就可以了。然后编译的时候加一个参数CPPFLAGS   = -D_FILE_OFFSET_BITS=64


 kof1688 回复于:2007-03-28 09:04:55

我一直在做,但只是实现个架子,参考一下楼主的代码,学了不小东西啦!


 redor 回复于:2007-03-28 10:46:54

引用:原帖由 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:15

CGI 1.1 支持 ?


 redor 回复于:2007-03-28 16:23:36

引用:原帖由 connet 于 2007-3-28 12:41 发表
CGI 1.1 支持 ? 



好像不难吧。。。。呵呵


 neoedmund 回复于:2007-03-29 10:17:15

how about lighttpd


 redor 回复于:2007-03-29 11:42:03

引用:原帖由 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:59

菜鸟我下下来研究一下


 cofish 回复于:2007-03-30 10:53:55

支持一个




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=915285
转载请注明作者名及原文出处



收藏本页到: