免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7048 | 回复: 16
打印 上一主题 下一主题

写了一个lite httpd [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-26 22:48 |只看该作者 |倒序浏览
我实现了一个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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-03-26 23:14 |只看该作者
鼓励一下吧

论坛徽章:
0
3 [报告]
发表于 2007-03-26 23:31 |只看该作者
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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

论坛徽章:
0
4 [报告]
发表于 2007-03-27 00:21 |只看该作者
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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


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

论坛徽章:
0
5 [报告]
发表于 2007-03-27 05:54 |只看该作者
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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


按照 RFC 实现就可以了。

.

论坛徽章:
0
6 [报告]
发表于 2007-03-27 09:21 |只看该作者
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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


RFC959 RESTART(REST)

论坛徽章:
0
7 [报告]
发表于 2007-03-27 09:43 |只看该作者
RFC 2045~2049

论坛徽章:
0
8 [报告]
发表于 2007-03-27 10:10 |只看该作者
原帖由 converse 于 2007-3-26 23:31 发表
稍微看了一下,问楼主一个问题吧,我也是刚接触http服务器,有些地方不太明白,趁机问一下。

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

主要是range支持。

论坛徽章:
0
9 [报告]
发表于 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

论坛徽章:
0
10 [报告]
发表于 2007-03-28 09:04 |只看该作者
我一直在做,但只是实现个架子,参考一下楼主的代码,学了不小东西啦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP