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
總結
以上是生活随笔為你收集整理的web server大全之GoAhead移植(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不要点进来。如题所示?
- 下一篇: 08年尼桑骐达二手车走了11万公里值多少