Tuesday, April 10, 2012

Simple Web Server (nweb.c) Running On Windows

在計算機科學概論上老師給了一份叫做nweb.c的程式碼,許多人不清楚怎麼讓他在Windows上跑起來,所以在這裡寫一份note。

Class Website : http://people.cs.nctu.edu.tw/~cjtsai/courses/ics/index.html
Simple C code (nweb.c) here : http://people.cs.nctu.edu.tw/~cjtsai/courses/ics/homework/nweb.c

以下以Dev-C++為IDE的例子,直接把nweb.c打開按下F9(compile and run)會出現以下的情況:


下頭有很多undefined的變數,這種情況往往表示library沒有連結好,於是乎我們開始下面的Steps來使這份程式順利跑起來。

  1. Link Library
  2. Create C:\public_html Directory
  3. Create index.html and favicon.ico

1. Link Library

先解決變數沒有定義的問題我們必須連結這份C code需要的函式庫(WS2_32.lib),一般使用令命列gcc的人可以很清楚的了解,只要在gcc command後面加上"-lws2_32"就好了,在Dev-C++(或是其他類似的IDE)也只要稍微設定一下即可。Dev-C++方法如下:


  • 選最上方的"Tools"
  • 選"Compiler Options"
  • 將"Add these commands to the linker command line"打勾
  • 該下方的輸入方格中輸入" -lws2_32 "
  • 按下"Ok"按鍵,完成設定
之後再次compile就會成功了,但是...


2. Create C:\public_html Directory

我們必須使用cmd(命令提示字元)去執行這份程式(因為他沒有pause,若是有錯誤,我們直接執行、不用cmd的方法將看不到任何訊息)

先移動到程式放置的資料夾,如在桌面的話:
>> cd Desktop
執行程式
>> nweb.exe
看到這樣的訊息:


因為這份程式需要讀取C:\public_html這個資料夾,解決方法很簡單,在C槽建立一個叫做public_html的資料夾即可:


再次執行...但是...


3. Create index.html and favicon.ico


我們必須放置一份index.html在已經建立好的C:\public_html資料夾裡面讓nweb去讀,index.html是一份用html寫成的網頁,其實也只是一份文字檔。
懂html甚至可以用「記事本」依照html語法寫好之後即可(就可以用網頁瀏覽器開啟);不懂的人在這裡也可以隨意找一份完成的html檔案放在該資料夾底下即可(也可用我的HelloWorld HTML檔:http://dl.dropbox.com/u/20358682/index.html,按右鍵另存檔案下載)。

於是乎我們再次用cmd執行程式:


程式剛跑起來的時候會出現以上三行文字後停滯,此時用網頁瀏覽器(chrome, firefox, IE, etc.)開啟localhost(在網址列打localhost),會發現瀏覽器可以順利載入我們放置好的index.html檔案。

但是!同時也發現cmd這邊的程式在瀏覽器開啟網站時也結束了,這跟我們期待的不同,server應當處理多次個服務,所以可以讓第二個、第三個、...使用者也可以讀取到index.html才對。這份C code會產生一份log檔案(nweb.syslog)在同資料夾底下,此份log中會紀錄程式運行的狀況或是問題,開起來看看發生什麼事情吧(選用記事本開啟即可,這也是一份文字檔罷了了):


最後一個SORRY寫到"failed to open file:favicon.ico"得知原來我們缺少favicon.ico檔案!

favicon.ico即是網頁載入時上頭的小icon,可以到這個網頁:http://www.favicon.cc/ 畫一個可愛的圖案、下載後放到C:\public_html就好囉!

DONE!!