web server大全のGoAhead移植

12925 ワード

回転:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml
 
注:最近はgoahead web serverを作って、TIチップ+linuxに移植しています。ここでまず関連する文章を回して勉強してください。助けてほしいです。web server大全のGoAhead移植*******************************    2009/02/14  [email protected]  wwww.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が含まれていない場合、60 Kのメモリだけが必要です。SSLを含み、500 Kのメモリが必要です。    12、ウェブページはROMまたはファイルシステムに存在することができる。    13、eCos、Linux、Lynch OS、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自ディレクトリ(自分で設計したウェブページを保存するためのもの)     |\______GoA headサーバのソースコード(Cプログラム)      \______webcomp.cホームページのコンパイラ    通常のWeb Serverとは違って、私達が設計したウェブページ(ASP、htmlなど)はコンパイル段階で解析され、サーバーのソースコードとコンパイルされました。他のサーバーのように運行段階でウェブページを読み、内容を解析するのではありません。    GoAheadルートディレクトリのwebcomp.cページコンパイラは、WebサブディレクトリのすべてのWebページを変換し、GoAhead WebサーバのソースコードとeCos他のアプリケーションコードと一緒にコンパイルすることができます。    ウェブサブディレクトリの下にはすべてのWebページの内容があります。Webサーバのすべてのページはこのディレクトリの下に置かなければなりません。    eCosサブディレクトリは、makefileファイルとmakefileファイルを含むeCosとのインターフェースを含んでいます。ユーザーは実際の必要に応じて、makefileファイルを修正することができます。    ecosディレクトリのmakefileファイルを読むことによって、GoAhead Webサーバのコンパイルプロセスは主に3つのステップがあることが分かります。    1、webcomp.cファイルをコンパイルし、ウェブコンパイラwebcomp.exeを生成する。webcomp.cはローカルコンパイラgccを使ってコンパイルし、コンパイルしたウェブコンパイラはecosサブディレクトリの下にあります。ウェブコンパイラはウェブサブディレクトリの下のすべてのページを変換してwebcomp.cファイルを生成します。webcomp.cファイルはecosサブディレクトリに保存されます。    2、クロスコンパイラはGoAheadルートディレクトリのWebサーバーのソースコードとウェブファイルwebcomp.cをコンパイルし、ライブラリファイルlibwebs.aを生成する。    3、eCosアプリケーションは、コンパイル時にライブラリファイルlibwebs.aとリンクし、ターゲットプラットフォームで実行可能な実行ファイルを生成する。    以下はecosサブディレクトリのmakefileファイルで、この3つのステップの実行過程が見られます。
# 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-O 2-DWEBS-DUMF-DOS=「Linux」-DLNINUX-D_STRUCT_TIMEVAL-I.。    makefileの修正が必要な以外に、main.cnファイルは最後の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_u uNFBITS    ルートディレクトリの下でuemf.hの中の下記の定義は衝突して、注釈は落ちます。    //#define O_RDONLY 1    ルートディレクトリの下でWS Intrn.hに下記の参照を追加し、コンパイルエラーを避ける。
#ifdef ECOS
#include 
#include 
#endif
    上で述べたのはすべてGoA head自身の修正で、私達の応用にとって、ecosディレクトリの下のメール.移植には通常、2つの場所を変更する必要があります。ecosの入り口点関数main()とWebサーバの初期化関数initWebs()です。    1、Webサーバの起動。main.cnファイルは主にWebサーバに対して独立したテストとデバッグを行うために使用されているので、直接にmain関数を使ってWebサーバを起動することができますが、実際のプロジェクト開発では、GoAhead Webサーバは、通常はeCosアプリケーションの機能モジュールの一つであり、この場合、Webサーバをスレッドとして起動することができます。    以下のコードは、Webサーバをスレッドとして起動する例である。スレッド入り口関数goahead_program(program)は元のmain.cnファイルの中のmain()入り口関数です。コードの中のWebサーバのスレッド優先度は16で、スレッド名は「GoAhead Web Server」です。eCosアプリケーションはドゥドゥを呼び出します。webs()関数は、Webサーバスレッドを起動します。このような場合は、mail.cファイル名を修正してeCosアプリケーションプロジェクトに加入して、他のソースプログラムと一緒にコンパイルしたほうがいいです。このとき使用するmake fileファイルは、「第12讲多目录の下でmake fileの一般的な书き方」ドキュメントを参照してください。
#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ファイル、ウェブサブディレクトリのウェブコンテンツ及びルートディレクトリのいくつかのファイルを修正した後、Cygwin環境下でまずWebサーバのソースのeCosサブディレクトリに入り、直接makeコマンドを使用してGoAheadのコンパイルプロセスを完成することができます。make cleanを使用して、コンパイルされたごみを消去できます。Webサーバーのソースコード、ウェブコンテンツ、man.cファイルを修正した後、命令を使用して前回のコンパイル結果とコンパイル中間ファイルをクリアしなければなりません。そうでないと、プログラムが正常に動作しないかもしれません。    mail.cファイルを修正しただけなら、直接下記のコマンドを使ってeCosアプリケーションのコンパイルができます。    $arm-elf-gcc main.cn-o webs-g-DWEBS-DEMF-DWEBVS_PAGE_ROM                 -DOS=「eCos」-DECOS-D_ECOS-D__u_uNOの_FNTL=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アプリケーションに複数のソースファイルが含まれている場合は、「第12回マルチディレクトリの下でmake fileの一般的な書き方」を参照してください。コマンドの3行目の2つの「-I」は、それぞれGoAheadとeCosのヘッダファイルパスを指定し、4行目はeCosのライブラリファイルパスとGoAhead Webサーバライブラリファイルlibweb.aを指定します。実際に使う時は具体的な経路によって修正します。図3 JavaScriptテスト図4 ASPフォームFormテスト入力図5 ASPフォームFormテスト出力結果ウェブページの設計例    前にASPウェブページの埋め込み関数について説明しました。ここではASPホームページの設計方法について議論します。以下はGoAhead Webサーバーのソースコードの中のフォームのウェブページforms.asp:GoForm Test Name:Addres:forms.aspは名前と住所を提出するページで、CGIプログラムformTestを呼び出してフォームを処理します。formTestはメモリCGIプログラムで、initWebs関数でwebs Formdefine()を使用して定義しなければなりません。mail.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
"), name, address); websFooter(wp); websDone(wp, 200); }
    このフォームは、CGIプログラムを処理して、まずnameとaddressの二つの変数値を取得してからフォームに入力された内容を個別のページで出力します。formTest関数の最後の4行からは、ページ出力の4つの基本関数も見られます。図4および図5は、フォーム入出力の2ページである。