blob: cae21764689999761753299c4472000896101f33 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
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 與檔
案數量並不多,所以僅使用簡單的陣列存放資料,並無使用特殊資料結
構來加速。
|