当前位置: 首页 > 编程日记 > 正文

web server大全之GoAhead移植(转载)

转自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml

注:最近在做goAhead web server和移植其到TI芯片+linux上,这里先转一篇相关的文章来学习下,希望有所帮助。。。
*******************************
* web server大全之GoAhead移植 *
*******************************
    2009/02/14  asdjf@163.com  www.armecos.com
    很多人希望在产品中使用Web Server,为此,我们总结了十几种各式各样的Web Server任君选择。Web Server开发再也不是困难的事情了。
    本文档介绍强大的嵌入式Web服务器GoAhead!!!
    它的主要特点是:

    1、支持ASP。
    2、嵌入式JavaScript---Ejscript。
    3、支持标准的CGI。
    4、支持内存中的CGI处理。
    5、快速响应,每秒可处理超过65个请求。
    6、符合HTTP 1.0/HTTP 1.1标准。
    7、拥有众多扩展API,方便用户开发。
    8、支持SSL 3.0.
    9、支持用户群组管理。
    10、支持DAA访问认证。
    11、小内存,如果不包含SSL,仅要求60K的内存:包含SSL,要求500K内存。
    12、Web页面可以存在于ROM或文件系统中。
    13、支持多种操作系统,如:eCos、Linux、LynxOS、QNX、VxWorks、WinCE、pSOS等。

图1 GoAhead运行效果。

图2 GoAhead源程序结构框图

GoAhead Web服务器是GoAhead公司早期推出的一种可以运行于多种平台的小巧而精致的Web服务器,它具有移植性好、开放源代码、代码量小的特点。GoAhead Web服务器特别适合于嵌入式系统。
    GoAhead Web服务器的详细说明文档位于GoAhead源码中的webs/docs目录下,源码可以从http://www.goahead.com下载。注意:由于目前eCos不支持用户群组,因此eCos不支持GoAhead的用户管理和访问控制功能。
    解压缩GoAhead源码到/g目录,可以看到GoAhead源码组织结构如下:
    /g
     |
     |\______各种OS移植子目录(如:ecos子目录)
     |\______Web自目录(用来保存自己设计的网页)
     |\______GoAhead服务器源码(C程序)
      \______webcomp.c网页编译器
    和通常的Web Server不同,我们设计的网页(ASP、html等)在编译阶段就被解析并和服务器源码编译到了一起,而不是象其他服务器那样在运行阶段读取网页并解析内容。
    GoAhead根目录下的webcomp.c网页编译器负责把Web子目录下的所有Web网页进行转换,使其能够与GoAhead Web服务器源码以及eCos其他应用代码一起编译。
    web子目录下是所有Web网页内容。Web服务器的所有网页都必须放置在该目录下。
    eCos子目录包含了与eCos的接口,包括main.c文件和makefile文件。用户根据实际需要可以对main.c和makefile文件进行修改。
    通过阅读ecos目录下的makefile文件可知,GoAhead Web服务器编译过程主要有三个步骤:
    1、编译webcomp.c文件,生成网页编译器webcomp.exe。webcomp.c使用本地编译器gcc进行编译,编译后的网页编译器位于ecos子目录下。网页编译器将web子目录下的所有网页进行转换并生成webcomp.c文件。webcomp.c文件将存放于ecos子目录下。
    2、交叉编译器对GoAhead根目录下的Web服务器源码和网页文件webcomp.c进行编译,生成库文件libwebs.a。
    3、eCos应用程序在编译时与库文件libwebs.a进行链接,生成可运行于目标平台的可执行文件。
    以下是ecos子目录下的makefile文件,从中可以看出这三个步骤的执行过程。

# eCos makefile
all: compile
#
# These definitions come from your eCos install tree
#
DEBUG := -g -Wall -O2
# For Cirrus Logic EDB72xx board
PKG_INSTALL_DIR := /tmp/untitled_install
COMMAND_PREFIX := arm-elf-
CFLAGS := -mcpu=arm7tdmi $(DEBUG)
# For Motorola PowerPC MBX/860
##PKG_INSTALL_DIR := /work/net_mbx/install
##COMMAND_PREFIX := powerpc-eabi-
##CFLAGS := -mcpu=860 -msoft-float $(DEBUG)
# 
# These should not need to be changed
#
CC := $(COMMAND_PREFIX)gcc
OBJCOPY := $(COMMAND_PREFIX)objcopy
AR := $(COMMAND_PREFIX)ar
LDFLAGS = -nostartfiles -L$(PKG_INSTALL_DIR)/lib -Wl,--gc-sections $(LIBS)
LIBS = -Ttarget.ld -nostdlib
CXXFLAGS      = $(CFLAGS)
EXTRACFLAGS   = -Wall -I$(PKG_INSTALL_DIR)/include -ffunction-sections -fdata-sections
EXTRACXXFLAGS = $(EXTRACFLAGS) -fno-exceptions -fno-rtti -fvtable-gc -finit-priority
# eCos build rules
%.o: %.c
$(CC) -c -o $*.o $(CFLAGS) $(EXTRACFLAGS) -Wp,-MD,$*.d $/dev/null
%.o: %.cxx
$(CXX) -c -o $*.o $(CXXFLAGS) $(EXTRACXXFLAGS) $.depend
#
# Build archive of objects
#
$(ARCH): $(OBJ_FILES)
$(AR) $(ARFLAGS) $(ARCH) $?
#
# Primary link
#
$(NAME): Makefile  main.o $(ARCH)
$(CC) -o $(NAME) $(CFLAGS) $(IFLAGS) \
main.o $(ARCH) $(LDFLAGS) 
clean:
rm -f $(NAME) $(ARCH) $(DEPEND_FILES) $(OBJ_FILES) 
rm -f main.o webrom.c webcomp web_files .depend
# 
# This tool needs to be built using the native C compiler
#
webcomp:
gcc -o webcomp -O2 -DWEBS -DUEMF -DOS="Linux" -DLINUX -D_STRUCT_TIMEVAL -I.. ../webcomp.c
#
# Build a set of ROMable pages
#
webrom.c: webcomp
find ../web -name "*.*" >web_files
./webcomp ../web web_files >webrom.c
# Dependencies
-include .depend

我们修改了makefile中的几个定义:
    1、PKG_INSTALL_DIR := /tmp/untitled_install 指向《ecos增值包》提供的系统库文件。
    2、修改cc为gcc,cygwin环境下编译器为gcc。增加-D_STRUCT_TIMEVAL定义,以避免uemf.h中的struct timeval结构体定义和ecos库中的已有定义冲突。
        gcc -o webcomp -O2 -DWEBS -DUEMF -DOS="Linux" -DLINUX -D_STRUCT_TIMEVAL -I.. ../webcomp.c
    除了makefile需要修改外,main.c文件需要将最后的send()和recv()函数定义注释掉,因为和ecos库里已有的定义冲突。
/******************************************************************************/

/*
* Wrappers for depreciated socket I/O functions
*/
/*
int send(int s, const void *buf, size_t len, int flags)
{return write(s, buf, len);
}
int recv(int s, void *buf, size_t len, int flags)
{return read(s, buf, len);
}
*/

/******************************************************************************/
    根目录下sockGen.c文件中需要增加如下定义,以避免编译错误。
    #include "sys/select.h"
    #define NFDBITS __NFDBITS
    根目录下uemf.h中的下列定义冲突,注释掉即可。
    //#define O_RDONLY 1
    根目录下wsIntrn.h中增加下列引用,以避免编译错误。

#ifdef ECOS
#include 
#include 
#endif

上面讲的都是GoAhead本身的修改,对于我们应用来说,还需要修改ecos目录下的main.c文件。移植时通常需要修改两个地方:ecos的入口点函数main()和Web服务器的初始化函数initWebs()。
    1、Web服务器的启动。main.c文件主要用于对Web服务器进行独立的测试和调试,因此可以直接使用main()函数来启动Web服务器,但是在实际项目开发中,GoAhead Web服务器通常只是eCos应用软件的一个功能模块,这种情况下,可以将Web服务器当成一个线程来启动。
    下面的代码就是把Web服务器当成线程启动的一个实例。线程入口函数goahead_program()就是原来main.c文件中的main()入口函数。代码中的Web服务器的线程优先级为16,线程名为"GoAhead Web Server"。eCos应用程序通过调用do_webs()函数来启动Web服务器线程。这种情况下,最好是修改main.c文件名并将其加入到eCos应用程序项目中,与其他源码程序一起编译。此时使用的makefile文件可参考《第十二讲 多目录下makefile的通用写法》文档。

#include  "../uemf.h"
#include  "../wsIntrn.h"
#include  
cyg_handle_t webs_thread_handle;
cyg_thread webs_thread_s; //space for web thread objects
char webs_stack[4096];    //space for 4K stacks
cyg_thread_entry_t goahead_program;
void do_webs(int argc, char *argv[])
{cyg_thread_create(16, goahead_program, (cyg_addrword_t) 0,"GoAhead Web Server", (void *)webs_stack, 163840,&webs_thread_handle, &webs_thread_s);cyg_thread_resume(webs_thread_handle);
}
void goahead_program(cyg_addrword_t data)
{bopen(NULL, (60 * 1024), B_USE_MALLOC);if (initWebs() Expanded ASP data:

在对eCos子目录下的makefile文件、main.c文件、web子目录的网页内容及根目录下的若干文件进行修改后,在Cygwin环境下首先进入到Web服务器源码的eCos子目录,然后直接使用make命令就可以完成GoAhead的编译过程。使用make clean可以清除编译垃圾,当修改了Web服务器源码、网页内容和main.c文件后,都必须使用该命令清除前一次的编译结果和编译中间文件,否则,程序运行可能不正常。
    如果只是修改了main.c文件,那么可以直接使用下面命令进行eCos应用程序编译:
    $arm-elf-gcc main.c -o webs -g -DWEBS -DUEMF -DWEBVS_PAGE_ROM
                 -DOS="eCos" -DECOS -D__ECOS -D__NO_FCNTL=1
                 -I.. -I/h/ecos-work/mywork_install/include
                 -L/h/ecos-work/mywork_install/lib libwebs.a
                 -Ttarget.ld -nostdlib -Wall -Wl,--gc-sections
    该应用程序直接使用了前面已经编译好的库文件libwebs.a。当eCos应用程序包含多个源码文件时,可参考《第十二讲 多目录下makefile的通用写法》文档。命令中第三行的两个“-I”分别指定了GoAhead和eCos的头文件路径,第四行指定了eCos的库文件路径和GoAhead Web服务器库文件libwebs.a。实际使用时要根据具体路径进行修改。
图3 JavaScript测试

图4 ASP表单Form测试输入

图5 ASP表单Form测试输出结果

网页设计举例
    前面已经对ASP网页的内嵌函数进行了说明。这里我们讨论ASP网页的设计方法。下面是GoAhead Web服务器源码中的一个表单网页forms.asp:
GoForm Test
Name:
Address:
forms.asp是一个提交姓名和地址的页面,它调用CGI程序formTest对表单进行处理。formTest是一个内存CGI程序,它必须在initWebs()函数中使用websFormdefine()进行定义。main.c中提供了一个表单处理函数的例子:

static void formTest(webs_t wp, char_t *path, char_t *query)
{char_t *name, *address;name = websGetVar(wp, T("name"), T("Joe Smith")); address = websGetVar(wp, T("address"), T("1212 Milky Way Ave.")); websHeader(wp);websWrite(wp, T(" 
Name: %s, Address: %s\n"), name, address);
    websFooter(wp);websDone(wp, 200);
}

该表单处理CGI程序首先获取name和address两个变量值,然后再将表单输入的内容以单独的一个页面进行输出。从formTest函数的最后四行还可以看出页面输出的四个基本函数。图4和图5为表单输入和输出的两个页面。

转载于:https://www.cnblogs.com/xiangwengao/archive/2013/04/29/3051409.html

相关文章:

tomcat苹果版安装步骤_Mac系统安装和配置tomcat步骤详解

一:下载打开Apache Tomcat官网,选择需要的版本下载:二:存放到本地文件夹重名民为ApacheTomcat,放到/Users/计算机名/Library/目录下三:启动Tomcat打开Terminal,进入ApacheTomcat所在目录的bin目录下$:cd /Users/mymac/Library/ApacheTomcat/bin1启动Tomcat$:./startup.sh1如果出…

Oracle 11g 数据类型

Oracle 11g Datatypes VARCHAR2(size [BYTE | CHAR]) 可变长度的字符串的最大长度有大小字节或字符。最大尺寸是4000字节或字符,最低为1个字节或1个字符。您必须指定VARCHAR2大小。 字节表示该列将有字节长度语义。 CHAR列表示将字符语义。 NVARCHAR2(size) 可变长度…

《DSP using MATLAB》Problem 6.3

天不亮又醒了,拍了张景象,这就是黎明前的黑暗吗 转载于:https://www.cnblogs.com/ky027wh-sx/p/9569038.html

进程间通信--命名管道

几个术语 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性临界资源:多个流可以访问的一个共同…

websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制

在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否…

【转载】Asp.Net 全生命周期

用三张图片详解Asp.Net 全生命周期 此文是转载阳阳多的博客内容,特此声明。 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户…

Context-Based Access Control (CBAC) 基于上下文的访问控制 理论知识

CBAC即基于上下文的访问控制协议,通过检查防火墙的流量来发现管理TCP和UDP的会话状态信息。这些状态信息被用来在防火墙访问列表创建临时通道。通过在流量一个方向上配置ip inspect列表,放行其返回流量。被允许会话是指来源于受保护的内部网络会话。它不…

week6 10 后端backend server和mongoDB通信

0 之前我们maogoDB用的是在线的mlab 在线他们帮我们做好了model 也就是那个schma 其实python也有类似的包 帮我们定义这些model 但是呢 我们自己来做吧 用一个传统的意义上mongoDB 就是 insert select来操作数据库 就是在不用其他类库 定义的model 我们如何操作数据库 我们这次…

Linux网络端口

Linux下端口个数 首先简单介绍一下Linux下的端口的函数,当Linux各个主机之间进行通信的时候我们需要将某些数据进程传输,这个时候就需要将数据传入到某一个特定 的主机,这个时候就使用了TCP/IP协议,IP地址是用来标识互联网的唯一…

汉字书写解码_《汉字解码学》   第一部分

《汉字解码学》第一部份汉字与世界密码文字的关系文字是人类语言的书写符号,是人类用来进行传递信息以便进行交流的可见符号系统。文字是人类文明的标识和产物。我们的祖先是如何来到中国的?世界科学研究关于人类基因的研究的最新成果表明:世…

WCF中服务继承多个契约的使用

服务继承多个契约其实也就是服务类实现了多个接口,主要是在配置中需要添加多个endpoint,各个endpoint之间的address不同、contract不同 契约: [html] view plaincopyprint?[ServiceContract] public interface IReportService { [Ope…

Pentaho平台上加仪表盘插件步骤

Pentaho平台上加仪表盘插件步骤 下面我将最近学习的在Pentaho平台上加仪表盘插件的步骤稍微整理了一下,希望对有需要的朋友有些帮助。 1. 解压插件包:cdf-de_0.2.tar.bz2(这个插件压缩包我即将上传) ,得到cdf- de_0.2 …

2018.09.01 poj3071Football(概率dp+二进制找规律)

传送门 概率dp简单题。 设f[i][j]表示前i轮j获胜的概率。 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1)^1(k−1)>>(i−1)1(k−1)>>(i−1)。 简单举个例子? 假设有八个人&a…

循环冗余检验CRC

CRC简介 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。 在数据传输过程中&#xff0c…

弹性碰撞后速度方向_$1.1.1 弹性碰撞经典例题1——力学及运动学

[ph1] 质量为2m的木块放置于质量为m的长木板上,木块与模板之间的动摩擦系数为 μ ,木板与地面的摩擦忽略不计。木块和木板以速度V0向右运动,在右侧足够远处有刚性墙壁,木块与墙壁发生完全弹性碰撞后向左运动,木板有足够…

一个简单实用的,基于EF的三层架构

到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会太差.我觉的这样的框架,就是一个好的框架.而且,我觉的做框架,千万不能…

转:中国互联网十五年的22个创新模式

中国互联网十五年的22个创新模式 今天,看网上有人推荐《沸腾十五年》,讲中国互联网从发源到现今。 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什么会是他们出来了。他们的…

2018 蓝桥杯省赛 B 组模拟赛(一)-年龄

今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不…

C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件

今天做了一个软件,想发布的时候才发现调用的类没几个,就像把它们都跟EXE文件打包在一起,以后复制去别的地方用也方便,于是上网搜了一下,发现网上大部分都是用ILMerge实现的,于是也自己试了一下,不过网上都没有详细的步骤演示,我就花点时间做了个教程,方便以后再有人想打包自己的…

IPC--消息队列

消息队列的特点 消息队列是生命周期是随进程的,同时消息队列可以实现的是消息的传递方向是双向的。接受者和发送者时通过发送一个数据块来进性消息传递的,每个消息的数据类型不一样依次来进行区分我们该取哪个数据。消息队列是基于消息的,并…

sqlinesdata教程_如何将Oracle数据导入MySQL

Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全…

关于PHP.ini文件的设定

php.ini文件中记录了php的配置,因此正确读取此配置文件对于php的部署实施很重要。 windows平台中,有2种常用的方法。 第一种方法:把php.ini复制到c:\windows目录中。 第二种方法:配置apache服务器,在..\Apache Softwar…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…

poj 1523(无向联通图的割点)

结合tarjan算法思想,这题终于写了出来。 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候&#…

IPC--信号量

信号量概念理解 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。信号量的工作原理:两个进程…

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡

很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法

2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存

有了之前的学习经验&#xff0c;共享内存对我们学习起来相对简单一些了&#xff0c;这里简单说说共享内存的一些&#xff0c;然后对于函数的分析直接在代码里面的注释部分有说明&#xff0c;如果还是不懂&#xff0c;可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据

本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码&#xff0c;带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市&#xff1f;答&#xff1a;柳州市有5个区、5个县(行政区划2020年7月)。分别为&#xff1a;城中区、鱼峰区…