Compile (Makefile) ------------------ 檔案名稱為 Makefile.或 Makefile.simple,這兩個檔案的內容是相同的。 輸入 make 即可編譯,make clean 可清除已編譯的檔案。有些變數可以在 執行 make 時更改以符合需求。這個程式必須使用支援 C99 或 C11 的 C 編譯器才能編譯成功,無法使用 C89 或 C++ 編譯器來編譯。 可修改的變數: CC C 編譯器執行檔名,預設是 c99 CFLAGS 使用者傳給 C 編譯器的參數(不會取代預設的必要參數) LDFLAGS 使用者傳給 linker 的參數(不會取代預設的必要參數) Compile (Autotools) ------------------- 執行 ./configure 即可產生 Makefile,並執行 make 來編譯。如果需要顯示編譯 時執行的指令,可用 make V=1。輸入 make dist 可將作業打包成 .tar.gz 檔案, 但由於預設的檔名不符合作業要求,需要額外執行 make submit 才能將檔名轉換成 作業要求的格式。 Fixed Severe Bug ---------------- 1. 修正傳送 ACCEPT / REJECT 時使用的 sizeof (const char*) 作為 buffer 大小的問 題。由於這是固定的數值,所以已經使用 #define 來替換。 2. 修正當第一次從 client 讀取資料時沒讀到換行而導致程式終止的問題。目前作法改 為藉由多次 handle_read (我已將它改名為 request_read) 來組合成完整的檔名。 3. 所有非 POSIX 標準函式都已經替換成 POSIX 內有規定的函式。bzero 改為 memset, 而 getdtablesize 改成 sysconf (_SC_OPEN_MAX)。 Other Notes and Changes ----------------------- 1. 將所有非必要的全域變數改為區域變數,減少名稱衝突的機會。 2. 將部份區域變數移入 if、for、while 的區塊內以方便管理。 3. init_server、init_request、free_request、handle_read 分別改為 server_init、request_init、request_free、request_read。 4. 為避免 client 提早離線導致 server 被終止,程式會忽略 SIGPIPE。 5. 為方便 debug 與檢查 memory leak,SIGINT 改為顯示 server 狀態, 而 SIGQUIT 則是正常結束 server 的方法(會使 while 迴圈結束)。 6. 為統一 debug 訊息格式,新增了 request_msg 和 request_err。 7. 對於相同的檔案,會記錄使用中的 client 數量,並統一管理所有使用 同一檔案的 client 的 file descriptor 和 lock。由於 client 與檔 案數量並不多,所以僅使用簡單的陣列存放資料,並無使用特殊資料結 構來加速。