iT邦幫忙

DAY 7
2

emacs的30天學習筆記系列 第 7

emacs 做中學第七天:mini web server :獵豹(cheetah)1.8,繼續GDB

  • 分享至 

  • xImage
  •  

HTTP ,P是協定的意思,如果有人問你那是什麼?答案可能很簡單,可能很複雜,有人說可以看flash就是HTTP(漫步在雲端的Jobs說,有品味的手機瀏覽器不支援flash)。有人說可以下載檔案就是HTTP(比FTP好用多了)。可以用GMAIL就是HTTP,慘了,焦點愈來愈模糊了…

因為想要實作,或是檢驗別人2003年寫的web server到底有沒有按規矩做,我們還是翻一翻協定的內容,http://www.w3.org/Protocols/,目前HTTP的版本編號是HTTP 1.1 draft -15 (2011-07-11發布) 。SPEC 分成7部分(PART),除了PART1 之外,其他六PART 幾乎不知道在講什麼,問題來了,怎麼檢驗別人的實作有符合規範呢?所以訂標準的組織,常常會出一些demo,也會出一些檢驗工具,來檢驗實作出來的產品,大家都符合SPEC,相容性就愈高。

顯然從這裏切入,不是很好的進入點。只是開了另一扇窗,看到不同的風景。

那就請GDB 幫忙指點一下迷津。
gdb 在除錯程式時,當有參數時,如果你用

gdb ./cheetah -d -l -v  ~/web_doc

沒有辦法進入除錯模式,這時你google ,會以為要用 attach 一個現成的
process來除錯,但顯然不太像是目前這個案例。有時你會卡住一段時間,
像現在已經晚上10點半了。attach 一個process,會多引入系統底層的一些
library,反而誤導你除錯的方向。
還好有之前練習的記憶,
知道換個方式,傳參數。

gdb ./cheetah

進入gdb模式
然後 用set args

set args -d -l -v  ~/web_doc

即可將參數傳入。
要看設了那些參數,
可以下

show args

.

再來是中斷點選擇。不能老是main了,雖然cheetah 程式碼很短。

首先,你如果有看昨天的分享,從browser 和 web server互動時,獵豹有丟一些訊息出來,查找這些關鍵字是一個方法。

有一組關鍵字,
Listening for connections on port 8000...
在程式的259 行附近

	if(verbose) printf("Listening for connections on port %d...\n", port);
	while(1) {
		newfd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size);
		if(newfd == -1) crit("Couldn't accept connection!");

		if(verbose) printf("Connected, handling request.\n");

這時候,你想找程式中,有關while,因為你知道,server 的動作,要hold住,
一直聽取 client的request,這時一個while 迴圈,很多這種hold住的感覺。

因為最近很流行hold住,所以你想看看程式裏,有多少while,
這時你可以在emacs裏,下 Esc-x rgrep,
按照它的指示,找那個字,附檔名要找那些,在那些目錄下,找

grep算是經典的find 工具,和昨天的search (Ctrl - s)相比,
是可以跨檔案的找,找到以後,在有超連結的地方,按ENTER可以快速的
切換。

所以535行也是另一個可以下中斷點的地方。

今晚順便試了一下,
在獵豹 on 起來的時候,網站目錄加上2nd.html, 3rd.html,
發現,在網址列上找
http://localhost:8000/2nd.html
http://localhost:8000/3rd.html
會找不到。
重啟服務時,發現在如下的訊息,

Parsed /home/timloo/web_doc/2nd.html as 2nd.html.
Parsed /home/timloo/web_doc/index.html as index.html.
Parsed /home/timloo/web_doc/3rd.html as 3rd.html.
Using system's sendfile functionality.

這個現象很有趣,
導致接下來的實驗,
1。加上目錄,及下面的檔案
2。把實體路徑,對應網站url。
3。如果是不同種類的檔案,如jpeg,png檔,會產生如何的對應?

當然,有了gdb這個工具,我們可以知道作者是如何實作的。
約是明晚的進度。

結論:
這枝程式是用fork(),來處理多個request,筆者就用firfox,開三個分頁,
就request。所以你知道,也可以用pthread來處理多工。

同時,還沒有解析,client 送訊息的格式,雖然,獵豹的簡易console也有秀,
但是覺得不符合我們看到很常的訊息內容,因為我們知道,web server的log可以
看訪問者的來源os,來源browser,來源ip ,來源語系。

而web server再回傳檔案或response時,應該也有一個標準訊息格式。

其實,這時候,如果我們動手腳,讓reponse的格式有問題,browser應該也會
秀相應的訊息。

這時一個好用的程式碼流覽器,相當重要。

以上。


上一篇
emacs 做中學第六天:來一個小小的web server ->Cheetah 1.8
下一篇
emacs 做中學第八天:
系列文
emacs的30天學習筆記38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chiounan
iT邦研究生 1 級 ‧ 2011-10-14 10:09:43

沙發
有幫助,期待您的下一篇。

我要留言

立即登入留言