web server大全之GoAhead移植(转载)
轉(zhuǎn)自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml
?
注:最近在做goAhead web server和移植其到TI芯片+linux上,這里先轉(zhuǎn)一篇相關(guān)的文章來學(xué)習(xí)下,希望有所幫助。。。
*******************************
* web server大全之GoAhead移植 *
*******************************
??? 2009/02/14? asdjf@163.com? www.armecos.com
??? 很多人希望在產(chǎn)品中使用Web Server,為此,我們總結(jié)了十幾種各式各樣的Web Server任君選擇。Web Server開發(fā)再也不是困難的事情了。
??? 本文檔介紹強大的嵌入式Web服務(wù)器GoAhead!!!
??? 它的主要特點是:
??? 1、支持ASP。
??? 2、嵌入式JavaScript---Ejscript。
??? 3、支持標(biāo)準(zhǔn)的CGI。
??? 4、支持內(nèi)存中的CGI處理。
??? 5、快速響應(yīng),每秒可處理超過65個請求。
??? 6、符合HTTP 1.0/HTTP 1.1標(biāo)準(zhǔn)。
??? 7、擁有眾多擴展API,方便用戶開發(fā)。
??? 8、支持SSL 3.0.
??? 9、支持用戶群組管理。
??? 10、支持DAA訪問認(rèn)證。
??? 11、小內(nèi)存,如果不包含SSL,僅要求60K的內(nèi)存:包含SSL,要求500K內(nèi)存。
??? 12、Web頁面可以存在于ROM或文件系統(tǒng)中。
??? 13、支持多種操作系統(tǒng),如:eCos、Linux、LynxOS、QNX、VxWorks、WinCE、pSOS等。
圖1 GoAhead運行效果。
圖2 GoAhead源程序結(jié)構(gòu)框圖
GoAhead Web服務(wù)器是GoAhead公司早期推出的一種可以運行于多種平臺的小巧而精致的Web服務(wù)器,它具有移植性好、開放源代碼、代碼量小的特點。GoAhead Web服務(wù)器特別適合于嵌入式系統(tǒng)。
??? GoAhead Web服務(wù)器的詳細(xì)說明文檔位于GoAhead源碼中的webs/docs目錄下,源碼可以從http://www.goahead.com下載。注意:由于目前eCos不支持用戶群組,因此eCos不支持GoAhead的用戶管理和訪問控制功能。
??? 解壓縮GoAhead源碼到/g目錄,可以看到GoAhead源碼組織結(jié)構(gòu)如下:
??? /g
???? |
???? |\______各種OS移植子目錄(如:ecos子目錄)
???? |\______Web自目錄(用來保存自己設(shè)計的網(wǎng)頁)
???? |\______GoAhead服務(wù)器源碼(C程序)
????? \______webcomp.c網(wǎng)頁編譯器
??? 和通常的Web Server不同,我們設(shè)計的網(wǎng)頁(ASP、html等)在編譯階段就被解析并和服務(wù)器源碼編譯到了一起,而不是象其他服務(wù)器那樣在運行階段讀取網(wǎng)頁并解析內(nèi)容。
??? GoAhead根目錄下的webcomp.c網(wǎng)頁編譯器負(fù)責(zé)把Web子目錄下的所有Web網(wǎng)頁進(jìn)行轉(zhuǎn)換,使其能夠與GoAhead Web服務(wù)器源碼以及eCos其他應(yīng)用代碼一起編譯。
??? web子目錄下是所有Web網(wǎng)頁內(nèi)容。Web服務(wù)器的所有網(wǎng)頁都必須放置在該目錄下。
??? eCos子目錄包含了與eCos的接口,包括main.c文件和makefile文件。用戶根據(jù)實際需要可以對main.c和makefile文件進(jìn)行修改。
??? 通過閱讀ecos目錄下的makefile文件可知,GoAhead Web服務(wù)器編譯過程主要有三個步驟:
??? 1、編譯webcomp.c文件,生成網(wǎng)頁編譯器webcomp.exe。webcomp.c使用本地編譯器gcc進(jìn)行編譯,編譯后的網(wǎng)頁編譯器位于ecos子目錄下。網(wǎng)頁編譯器將web子目錄下的所有網(wǎng)頁進(jìn)行轉(zhuǎn)換并生成webcomp.c文件。webcomp.c文件將存放于ecos子目錄下。
??? 2、交叉編譯器對GoAhead根目錄下的Web服務(wù)器源碼和網(wǎng)頁文件webcomp.c進(jìn)行編譯,生成庫文件libwebs.a。
??? 3、eCos應(yīng)用程序在編譯時與庫文件libwebs.a進(jìn)行鏈接,生成可運行于目標(biāo)平臺的可執(zhí)行文件。
??? 以下是ecos子目錄下的makefile文件,從中可以看出這三個步驟的執(zhí)行過程。
# 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增值包》提供的系統(tǒng)庫文件。
??? 2、修改cc為gcc,cygwin環(huán)境下編譯器為gcc。增加-D_STRUCT_TIMEVAL定義,以避免uemf.h中的struct timeval結(jié)構(gòu)體定義和ecos庫中的已有定義沖突。
??????? gcc -o webcomp -O2 -DWEBS -DUEMF -DOS="Linux" -DLINUX -D_STRUCT_TIMEVAL -I.. ../webcomp.c
??? 除了makefile需要修改外,main.c文件需要將最后的send()和recv()函數(shù)定義注釋掉,因為和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本身的修改,對于我們應(yīng)用來說,還需要修改ecos目錄下的main.c文件。移植時通常需要修改兩個地方:ecos的入口點函數(shù)main()和Web服務(wù)器的初始化函數(shù)initWebs()。
??? 1、Web服務(wù)器的啟動。main.c文件主要用于對Web服務(wù)器進(jìn)行獨立的測試和調(diào)試,因此可以直接使用main()函數(shù)來啟動Web服務(wù)器,但是在實際項目開發(fā)中,GoAhead Web服務(wù)器通常只是eCos應(yīng)用軟件的一個功能模塊,這種情況下,可以將Web服務(wù)器當(dāng)成一個線程來啟動。
??? 下面的代碼就是把Web服務(wù)器當(dāng)成線程啟動的一個實例。線程入口函數(shù)goahead_program()就是原來main.c文件中的main()入口函數(shù)。代碼中的Web服務(wù)器的線程優(yōu)先級為16,線程名為"GoAhead Web Server"。eCos應(yīng)用程序通過調(diào)用do_webs()函數(shù)來啟動Web服務(wù)器線程。這種情況下,最好是修改main.c文件名并將其加入到eCos應(yīng)用程序項目中,與其他源碼程序一起編譯。此時使用的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子目錄的網(wǎng)頁內(nèi)容及根目錄下的若干文件進(jìn)行修改后,在Cygwin環(huán)境下首先進(jìn)入到Web服務(wù)器源碼的eCos子目錄,然后直接使用make命令就可以完成GoAhead的編譯過程。使用make clean可以清除編譯垃圾,當(dāng)修改了Web服務(wù)器源碼、網(wǎng)頁內(nèi)容和main.c文件后,都必須使用該命令清除前一次的編譯結(jié)果和編譯中間文件,否則,程序運行可能不正常。
??? 如果只是修改了main.c文件,那么可以直接使用下面命令進(jìn)行eCos應(yīng)用程序編譯:
??? $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
??? 該應(yīng)用程序直接使用了前面已經(jīng)編譯好的庫文件libwebs.a。當(dāng)eCos應(yīng)用程序包含多個源碼文件時,可參考《第十二講 多目錄下makefile的通用寫法》文檔。命令中第三行的兩個“-I”分別指定了GoAhead和eCos的頭文件路徑,第四行指定了eCos的庫文件路徑和GoAhead Web服務(wù)器庫文件libwebs.a。實際使用時要根據(jù)具體路徑進(jìn)行修改。
圖3 JavaScript測試
圖4 ASP表單Form測試輸入
圖5 ASP表單Form測試輸出結(jié)果
網(wǎng)頁設(shè)計舉例
??? 前面已經(jīng)對ASP網(wǎng)頁的內(nèi)嵌函數(shù)進(jìn)行了說明。這里我們討論ASP網(wǎng)頁的設(shè)計方法。下面是GoAhead Web服務(wù)器源碼中的一個表單網(wǎng)頁forms.asp:
GoForm Test
Name:
Address:
forms.asp是一個提交姓名和地址的頁面,它調(diào)用CGI程序formTest對表單進(jìn)行處理。formTest是一個內(nèi)存CGI程序,它必須在initWebs()函數(shù)中使用websFormdefine()進(jìn)行定義。main.c中提供了一個表單處理函數(shù)的例子:
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兩個變量值,然后再將表單輸入的內(nèi)容以單獨的一個頁面進(jìn)行輸出。從formTest函數(shù)的最后四行還可以看出頁面輸出的四個基本函數(shù)。圖4和圖5為表單輸入和輸出的兩個頁面。
轉(zhuǎn)載于:https://www.cnblogs.com/xiangwengao/archive/2013/04/29/3051409.html
總結(jié)
以上是生活随笔為你收集整理的web server大全之GoAhead移植(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不要点进来。如题所示?
- 下一篇: 【转载】Asp.Net 全生命周期