梦想是在汗水中渐渐绽放的小雏菊——daisy 迷你web服务器0.2版
primula2012/12/21软件综合 IP:广东
梦想是在汗水中渐渐绽放的小雏菊
它一定不会背叛曾经的各种苦逼

为什么不是0.1版呢?
因为0.1版在刚刚准备发布之前,加上了断点续传下载,所以就升级成0.2版了。

这本来是在上个星期学习网络编程的时候,从想试一下直接编程从一个web服务器的80端口能读到什么东西,到想试一下假装一个web服务器发送点报文什么的,到后来一点点的加上去,就变成了现在这样。。

这是一个mini的web服务器,运行在linux上,可以用C语言写动态页面,用在嵌入式系统上很好玩的,虽然很mini,但是该有的功能都有了.

          它能加载静态网页,javascript脚本,dsl页面,并能够根据优先级查找默认页面。
          支持get和post方法传递参数。
          支持断点续传下载
          支持配置成单线程或多线程模型
          最主要的是,它很小.....

    对了,那个dsl页面是什么?它是daisy servlet的缩写^_^,是模仿servlet的那种感觉,用C语言来写的动态页面,可能有点像CGI,但我没用过实际像不像也不知道...,我感觉形式上还是像servlet。

在压缩包中提供了两个sdl程序的示例,其中在frist文件夹下有这样一个程序
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "daisy_dsl.h"

int main(int argc, char *argv[])
{
    diter_t iter;

    dsl_init(argc,argv); //初始化环境
    dsl_iter_init(&iter);//得到一个迭代器,获取从get或者post方法传递过来的参数用

    dsl_write("
daisy lib test!
");
        
    while(dsl_iter_hasnext(iter))      //如果有下一个参数。。。
    {  
        dsl_write("
%s
",dsl_iter_getnext(&iter,NULL,0));//打印出这个键值对        
    }  

    dsl_write("
get parameter: %s
",dsl_getparamter("primula",NULL,0));//获取一个名叫“primula”的参数
    dsl_write("

");

            
    dsl_close();//关闭输出流
    return 0;

}

上面就是一个简单的
编写一个dsl页面需要用到一个库,库的源代码在daisy_servlet目录下,但是目前比较简陋,也没有什么注释。。。
库的文件放在lib目录下,是一个静态库,库的头文件是include目录下的daisy_dsl.h,在提供的两个示例程序中,有makefile可以作为模版参考。
简要说下库中的几种方法,因为目前源文件中还没有什么注释,都是下课时间写的,匆忙,见谅。。。。


/*初始化环境,将main函数的参数直接传进来*/
int dsl_init(int argc, char *argv[]);
/*向流中写入数据,与printf用法类似,但要先用dsl_init初始化*/
dsl_write(fmt, args...) fprintf(dsl_stream, fmt, ## args)  //;fflush(dsl_stream);
//int dsl_write(char *str);
/*关闭流,程序退出前记得关闭。。*/
int dsl_close();
/*获得访问页面使用的URL*/
char* dsl_get_url();
/*得到一个读取参数的迭代器传参时取地址*/
diter_t dsl_iter_init(diter_t *iter);
/*测试是否有下一个元素,参数为前面创建的迭代器*/
int dsl_iter_hasnext(diter_t iter);
/*得到下一个参数对,是一个字符串,参数一为一个迭代器的指针
    参数二为装这个字符串的buffer,参数3是buffer长度,如不需要修改内容
    buffer可以为NULL,长度为0,返回值为字符串首地址,但使用返回值不能
    去修改参数内容
*/
char* dsl_iter_getnext(diter_t *iter, char *buff,char buffsize);
/*根据名字获取一个参数值,如不存在则为NULL,参数23同上。。*/
char* dsl_getparamter(char *name,char *buff,char buffsize);

在example目录下还有一个shutdown文件夹,它通过一个html页面提交一个表单到dsl页面中(dsl上面说过是C语言写的)如果密码正确可以关掉运行中服务器或者让服务器重启,只是为了演示这种网页对底层控制的方式,因为走mini的嵌入式路线嘛。。。。
未命名.jpg

然后再说说目录内容
bin中装的是编译出来的文件,一个是daisy_core,还有个是launcher,daisy_core是主程序,可以直接运行,但执行launcher可以把core送到后台守护进程去运行,不占终端嘛。。所以运行一般用launcher,测试的时候直接运行core。
core目录就是主要代码啦
core_launch就是launcher的代码了,运行launcher的时候,它会生成一个XXXXXXXXXXX的脚本,方便关掉变成守护进程的daisy核。
daisy_servlet 就是dsl库的源文件,同样现在还很简陋。。。
errpage是存放错误页面的,现在只定义了404错误,和414URL太长的错误,post的数据长了暂时也算在414上。
example就是示例程序了,目前只有两个。
include是编写dsl需要的头文件。
lib是编写dsl需要的库文件,只有一个静态库,编译参考的makefile还是在example里。
webroot就是服务器的根目录啦。
然后就是三个脚本,分别是启动,停止,和调试启动,启动使用的是luncher,调试启动就直接加载的daisy core

关于服务器的参数配置,这个目前还比较尴尬,因为没有做配置脚本所以就只有在头文件中配置,配置的头文件是core/include/daisy_config.h,调试版本啊,线程配置,web根目录,默认错误页面啊什么的都在里面,那个KEEP_ALIVE不要打开,那个是关于http连接保持的,目前还没有实现。。。
如果要移植到arm上,那就把顶层makefile的CC改成arm-linux-gcc吧,源文件都不用改,但是注意那个库的生成命令也要把ar改成arm-linux-ar。。

以上就是daisy0.2版的简单介绍,提供源码,参考学习,时间不宽裕,所以很多地方没写注释,也不怎么规范,以后逐渐完善,如果哪位高手有高见的话,不要吝啬让我学习下呗~[s:227]各种设计结构编码内存效率算法问题上欢迎各种拍砖,有砖头垫脚才能站得更高\^_^/
E-mail:primula@XXXXXXXXXt



attachment icon daisy_0.2.rar 74.48KB RAR 47次下载
+32  科创币    vocal@ルカ    2012/12/22 高质量发帖
+30  科创币    badboy-fly    2012/12/22
+32  科创币    绘梦工坊    2012/12/22
+25  科创币    daxus    2012/12/22 很实用的东西,至少对我非常有参考价值
+40  科创币    celeron533    2012/12/22 高质量发帖
+25  科创币    cqsrmxxzyx    2012/12/22 高质量发帖,鼓励一下
+100  科创币    phpskycn    2012/12/26 高质量发帖
+50  科创币    猎鹰    2012/12/26 高质量发帖
+10  科创币    jrcsh    2012/12/27
来自:计算机科学 / 软件综合
21
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
primula 作者
12年2个月前 IP:未同步
480960
QQ图片20121222100836.jpg
在arm上运行是没有问题的,这段时间准备再写点控制在网页上控制LED之类的简单示例。
刚才有朋友说运行有问题,提示缺少什么什么库,这个是因为编译的版本不一样,我用的ubuntu12.10,如果版本低点的,make clean后再make就可以运行啦。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
badboy-fly
12年2个月前 IP:未同步
480978
由此贴可以总结出高质量发帖大多数情况下都是没人看的[s:275]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年2个月前 IP:未同步
480985
回 2楼(badboy-fly) 的帖子
[s:240]难道不合大家胃口。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kesshei
12年2个月前 IP:未同步
480987
好东西啊    原理不甚了解,能整个解析么    好么     赞楼主一下下。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
daxus
12年2个月前 IP:未同步
481036
很实用的东西,至少对我非常有参考价值
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年2个月前 IP:未同步
481055
回 4楼(kesshei) 的帖子
原理的话就是监听80端口,如果有连接来的话就解析HTTP报文。

我们用的浏览器访问网站的时候,默认情况下都是连接的服务器80端口,这个端口号是约定俗成的,但是也可以显示指定,比如XXXXXXXXXXXXXX:1234,就是显示指明要连接服务器的1234端口访问网页。
客户端,或者说浏览器在连接上服务器后,会传送一段http报文,大概内容就是下面这样的:

        GET /XXXXXXml HTTP/1.1
        Accept: */*
        Accept-Language: zh-cn
        Accept-Encoding: gzip, deflate
        User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
        Host: XXXXXXXXXXXXXX
       Connection: Keep-Alive
         。
         。
         。
其中第一行,GET表示以get方式发送的请求,/XXXXXXml表示访问网站根目录下的一个叫XXXXXXml的页面,剩下的内容就是关于访问哪个域名啊,或者还有断点续传的请求起始位置之类的。
服务器程序要做的就是解析报文头,然后把相应的页面传过去。

关于那个动态页面,就是通过创建进程的方式,以一个实现约定好的参数形式把客户端的连接交给动态页面那个程序,由程序处理后将结果传回标准http格式内容,实现页面内容可变的功能。
这样做的好处就是可以像设计网页一样设计程序界面,并且这个界面就是一个网页,外网也能访问,但是这个页面的结果是交给另一个程序处理的,就达到了界面和处理程序分离的目的,以后想改界面,只需要修改网页,程序都不用重新编译。还有个好处就是网页可以直接控制硬件了。

我觉得最有用的就是这种分层设计,界面和处理逻辑分离,同时也有底层控制能力,用在嵌入式系统上很适合。
+50
科创币
vocal@ルカ
2012-12-24
高质量发帖
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cqsrmxxzyx
12年2个月前 IP:未同步
481128
不错不错,赞一个
和libmicrohttpd有点像,还多了些功能
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
celeron533
12年2个月前 IP:未同步
481129
回 6楼(primula) 的帖子
有Enterprise System 的感觉了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
腹黑小白兔
12年2个月前 IP:未同步
481162
嵌入式什么的还是很高端的样子
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kesshei
12年2个月前 IP:未同步
481468
回 6楼(primula) 的帖子
应该是美女高手吧  谢谢你的解答,让我瞬间就明白了。原来是报头啊,侦听端口 挺有用的,学习了。嘿嘿  等有币币了 多给你点 嘿嘿。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年2个月前 IP:未同步
481591
回 10楼(kesshei) 的帖子
额,我只是喜欢妹子,但不是妹子[s:178]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
12年1个月前 IP:未同步
481933
支持LZ发原创帖……
求开发手册/设计文档,,或者更详细的原理
+1
科创币
primula
2012-12-26
详细的原理和使用手册随下个版本一起发吧,已经发现若干个问题,这周五考完试就开始写。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
清纯小萝莉
12年1个月前 IP:未同步
481986
回 11楼(primula) 的帖子
我一直觉得你就是妹子。。。。。。。。。。。。。。你说你喜欢妹子。。。。。。难道你是百合?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年1个月前 IP:未同步
482022
回 13楼(清纯小萝莉) 的帖子
呃....我不是妹子![s:222]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
乖乖乖
12年1个月前 IP:未同步
482204
其实用libevent可以很轻松搞个webserver,不过不知道arm神马的资源够不够跑libevent
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年1个月前 IP:未同步
482252
回 15楼(乖乖乖) 的帖子
这个只是在学习网络编程的时候写的,用别人的没有自己从头写的学得多吧...
就像java,写过很久都没彻底明白底层的原理,都是调用这个调用那个,运行原理只知道个大概。
自己这么敲了两下,里里外外就都清楚了。

而且感觉用人家的没得那种创造的快感[s:227]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年1个月前 IP:未同步
483279
新版本支持C语言和HTML标签混写。嵌入式linux web服务器小雏菊仍在成长中[s:274]


未命名.jpg
+50
科创币
phpskycn
2012-12-31
为什么是C和HTML混写……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
primula作者
12年1个月前 IP:未同步
483355
因为是用来写动态网页的呗~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
martinou
10年5个月前 IP:未同步
714646
32个赞,仰望高人
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jinghfs
10年4个月前 IP:陕西
722140
高手啊,膜拜。这都能自己写啊。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
primula
学者 机友 笔友
文章
20
回复
184
学术分
1
2012/03/10注册,6个月15天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}