web--嵌入式網頁的設計


Goahead是一款適合嵌入式的web Server, 支持asp,cgi,embedded JavaScrip等腳本語言 基本上在windows下或者在redhat9下面只要make一下就能運行了. 體積小巧的嵌入式服務器:GoAhead GoAhead Web服務器,小巧,精致,提供了值得稱道的性能。 GoAhead Web 服務器是一款主要面向嵌入式系統的WEB服務器,它的目標也許不在於目前的WEB服務器市場,而是面向當嵌入式系統深入我們的工作與生活的明天,那時,它也許會成為使用最廣泛的WEB服務器。 GoAhead Web服務器是GoAhead公司的Embedded Management Framework產品的一部分,這個軟件包主要用於解決未來嵌入式系統開發的相關問題。這款WEB服務器非常小巧,它的WIN CE版本編譯后的大小還不到60k,它的輸出通常也是面向一些小屏幕設備。在性能方面,使用一顆24MHz的68040處理器,它的響應速度為20次/秒,使用266MHz的Pentium處理器可以達到50次/秒的響應速度。 僅管它的體積非常小巧,GoAhead WEB服務器提供了不少的服務特性。它支持ASP,嵌入的JAVASCRPT與內存CGI處理。不過有人也許會置疑對嵌入式系統而言,對ASP的支持有否有這個必要。而嵌入的JAVASCRIPT解釋引擎則是不得不然的選擇,因為得用它創建動態服務器內容,而且ASP也要用到它。 到目前為止,GoAhead的源碼完全免費,使用它無需交納版稅或者許可證費用。對一些硬件開發者而言,這種做法比較普遍,例如SUN旗下的眾多開源系統。這樣作的主要原因是GoAhead公司希望它成力未來嵌入式環境下的WEB服務器標准平台並看好日益增長的更智能化嵌入式設備的市場。 因為GoAhead發行包中包含C語言的源碼和makefile,理論上,你可以在非嵌入式環境下很好的使用GoAhead Web服務器(正如我寫這篇文章時所做的)。它的參考平台有Windows CE, Wind River VxWorks, Linux, Lynx, QNX,與Windows 95/98/NT。它基本上屬於一個HTTP1.0標准的WEB服務器,對一些HTTP1.1的特性如(持久連接)也提供了支持。 無可否認,GoAhead WEB服務器是一款面向特定細分市場的產品,也許目前對於這個市場外的大多數人來說很難對它投以太多的專注。但眾多的分析家和計算機產業領導者(包括LINUX之父Linus Torvalds)都相信在未來的計算機世界,智能化嵌入式系統將會扮演一個極在重要的角色,當這個市場成熟起來的時候,就是GoAhead大展站拳腳之時。 優點:免費,體積小巧,支持多平台,完全針對嵌入式系統設計,嵌入的JavaScript與動態數據頁支持。 缺點:對ASP的支持意味着要依靠微軟平台,很少的安全方面的考慮。 筆者移植的是目前官方網站發布的最新版本(截至2008-11-26)。webs218.tar.gz 網址為: http://www.goahead.com/products/webserver/download.aspx 值得高興的是,筆者在移植最新的版本前,也按着各種文檔嘗試移植以前的版本,但由於各種各樣奇怪的問題都沒有成功,一氣之下直接移植最新的版本,沒有想到是如此容易。 首先是解壓: [root@localhost /]# Tar zxvf webs218.tar.gz 改名為goahead [root@localhost /]# mv ws031202/ goahead 可以看到,goahead支持很多的操作系統,如LINUX,VXWORKs,Windows CE等。 修改Goahead/LINUX/Makefile文件 修改Goahead/LINUX/Makefile文件,在 Goahead/LINUX/makefile 開頭添加如下的黑斜體部分的文字。 # CROSS_COMPILE為交叉編譯器所在路徑,如果為uCLinux,則為CROSS_COMPILE = arm-elf-,如果為MIPS,則為CROSS_COMPILE = mipsel-linux-,如果為2410,則為armv4l-unknown-linux-,注意,在/root/.bash_profile中要指明路徑,具體為加入export PATH=$PATH:/xxxxxxx/bin ################################################################ CROSS_COMPILE = armv4l-unknown-linux- AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump all: compile ARCH = libwebs.a NAME = webs # User Management switch UMSW = -DUSER_MANAGEMENT_SUPPORT # Digest Access switch DASW = -DDIGEST_ACCESS_SUPPORT ………….(省略) main.o: main.c ../wsIntrn.h ../webs.h ../ej.h ../ejIntrn.h ../uemf.h # # Transition rules (add -o to put object in right directory) # .c.o: #cc -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $ $(CC) -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $ #################################################################### 然后在goahead/LINUX目錄下直接 make 修改一個危險函數,消除警告 此時會出現如下錯誤 mipsel-linux-gcc -o webs -g -Wall \ -DWEBS -DUEMF -DOS="LINUX" -DLINUX -DUSER_MANAGEMENT_SUPPORT -DDIGEST_ACCESS_SUPPORT -I.. \ main.o libwebs.a main.o: In function `websGetCgiCommName': /goahead/LINUX/main.c:325: warning: the use of `tempnam' is dangerous, better use `mkstemp' 解決辦法: 找到main.c (goahead/LINUX目錄) 文件,在函數websGetCgiCommName(..)函數中 char_t *websGetCgiCommName() { char_t *pname1, *pname2; //pname1 = tempnam(NULL, T("cgi")); pname1 = (char_t *)mkstemp(T("cgi")); pname2 = bstrdup(B_L, pname1); free(pname1); #ifdef Wreturn pname2;T } 此時將能夠編譯通過。下一步就是安裝到嵌入式開發板上運行。 解決無法連接問題 但發現還是無法運行,經分析原來是名稱無法解析造成的,因此,建議直接改為IP地址方式。 web初始化的時候有這樣的 code: if (gethostname(host, sizeof(host)) error(E_L, E_LOG, T("Can't get hostname")); return -1; } if ((hp = gethostbyname(host)) == NULL) { error(E_L, E_LOG, T("Can't get host address")); return -1; } gethostname得到的host為"(none)";gethostbyname則調用失敗,返回NULL;我用printf("Error:%s\n",hstrerror(h_errno));查看錯誤,得到的是Error:Host Name Lookup failure! 而且我用hostname khy;設置主機名后,gethostname能得到名字為khy,但下面gethostbyname函數調用仍然返回失敗。這樣webserver沒辦法運行。 main.c(linux) 文件 initwebs(...) 函數中: /* if ((hp = gethostbyname(host)) == NULL) { error(E_L, E_LOG, T("Can't get host address")); fprintf(stderr,"initWebs: host name %s\r ",host); return -1; } memcpy((char *) &intaddr, (char *) hp->h_addr_list[0], (size_t) hp->h_length); */ intaddr.s_addr = inet_addr("10.2.2.14"); // 44B0的網卡IP gethostbyname函數在此處無效,我屏蔽了這段,不得已只能直接寫入IP地址給intaddr了。非常重要。 直接注意的是,如果在開發板上輸入hostname ,顯示hostname 10.2.2.14和ifconfig 顯示的IP 一致時,上述代碼不用修改。除此之外,都需要修改,否則會提示如下錯誤。 十分頭疼的`GLIBC_2.3' not found問題 本人目前所在的課題組都基於龍芯CPU核,該核采用MIPS指令集,目前已有的交叉編譯環境雖有兩個版本。 [root@srv3 bin]# ./mipsel-linux-gcc -v Reading specs from ./../lib/gcc-lib/mipsel-linux/2.96/specs gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-113.2) neon [root@srv3 bin]# mipsel-unknown-linux-gnu-gcc -v Reading specs from /Cross/cross_gcc3.4.3/bin/../lib/gcc/mipsel-unknown-linux-gnu/3.4.3/specs Configured with: ../gcc-3.4.3/configure --target=mipsel-unknown-linux-gnu --prefix=/opt/cross_gcc3.4.3 --enable-languages=c --without-headers --disable-shared --disable-threads : (reconfigured) ../gcc-3.4.3/configure --target=mipsel-unknown-linux-gnu --prefix=/opt/cross_gcc3.4.3 --enable-languages=c --without-headers --disable-shared --disable-threads -with-newlib : (reconfigured) ../gcc-3.4.3/configure --target=mipsel-unknown-linux-gnu --prefix=/opt/cross_gcc3.4.3 --enable-languages=c,c++ : (reconfigured) ../gcc-3.4.3/configure --target=mipsel-unknown-linux-gnu --prefix=/opt/cross_gcc3.4.3 --enable-languages=c Thread model: posix gcc version 3.4.3 但有一個很致命的問題是,它們所使用的GLIBC的版本都是libc-2.2.5.so,低於2.3,很多高版本軟件的編譯不僅對GCC編譯器有高版本要求,而且對GLIBC庫也要求高於2.3 版本,因此 /lib/libc.so.6: version `GLIBC_2.3' not found (required by webs) 的錯誤提示就是這個意思,只要高於所指定的2.3版本即可,並不要求必須等於該版本。 解決辦法:重新找一個 高版本GLIBC庫(ftp://ftp.gnu.org/)重新編譯,或重新找一個已經編譯好的工具鏈,作者嘗試前者時遇到了很多莫名其妙的錯誤,尚未成功,后來在下面所列的網站上找到了已經編譯好的版本較高的交叉編譯器mipseltools-gcc412-lnx26.tar.gz。 http://www.ingenic.cn/pfwebplus/productServ/kfyd/linux/pfFixedPage.aspx 下載后直接解壓縮即可。 當提示以上錯誤時,只需要將libc相關庫文件從mipseltools-gcc412-lnx26/lib拷貝到嵌入式開發板根文件系統的lib下,覆蓋低版本glibc即可,注意符號連接不能丟失,用cp –raf xxx yyy方式拷貝,再次運行,此時會提示更莫名其妙的錯誤segmentation fault,一時讓筆者心灰意冷,通過ldd webs(在開發板上輸入)發現webs不僅依賴libc庫,而且還依賴ld,於是想到可能還是版本問題,於是將ld相關庫也從mipseltools-gcc412-lnx26/lib拷貝到嵌入式開發板根文件系統的lib下,重新運行就ok了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM