Sunday, December 5, 2010

libev を使った web server Lighttz を make してみた

まずは、libev のインストール

[192.168.162.128] cvs -z3 -d :pserver:anonymous@cvs.schmorp.de/schmorpforge co libev
[192.168.162.128] cd libev
[192.168.162.128] autoheader
[192.168.162.128] aclocal
[192.168.162.128] autoconf
[192.168.162.128] touch ltmain.sh
[192.168.162.128] automake -a
[192.168.162.128] ./configure --prefix=$HOME/local
[192.168.162.128] rm libtool
[192.168.162.128] ln -s /usr/bin/libtool libtool
[192.168.162.128] make
[192.168.162.128] make install
libtool がうまく動かなかったので置き換え lighttz の方では、以下のように Makefile を書き換えて gmake
[192.168.162.128] cat Makefile
lighttz: lighttz.o
        gcc -o lighttz ./lighttz.o -L$$HOME/local/lib -lev -u is_default_loop

lighttz.o: lighttz.c
        gcc -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"lighttz.d" -MT"lighttz.d" -I../libev -o $@ ./lighttz.c

clean:
        rm -f lighttz.o lighttz

start:
        LD_LIBRARY_PATH=/home/sikaku/local/lib/ ./lighttz &
起動してみる。
[192.168.162.128] LD_LIBRARY_PATH=/home/sikaku/local/lib/ ./lighttz &

[192.168.162.128] curl http://localhost:8002/
curl: (18) transfer closed with 1 bytes remaining to read
Hello World

Hello World

[192.168.162.128]
どうやら、1byte 書き出しが少ないようだ。
以下のように修正するとうまくいく
Index: lighttz.c
===================================================================
--- lighttz.c   (revision 103)
+++ lighttz.c   (working copy)
@@ -76,7 +76,7 @@
        char superjared[]="HTTP/1.1 200 OK\r\nContent-Length: 336\r\nConnection: close\r\nContent-Type: text/html\r\nDate: Sat, 26 Apr 2008 01:13:35 GMT\r\nServer: lighttz/0.1\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" version=\"-//W3C//DTD XHTML 1.1//EN\" xml:lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><title>Hello World</title></head><body><p>Hello World</p></body></html>";

        if (revents & EV_WRITE){
-               write(cli->fd,superjared,strlen(superjared));
+               write(cli->fd,superjared,strlen(superjared)+1);
                ev_io_stop(EV_A_ w);
        }
        close(cli->fd);

No comments:

Post a Comment