| 此次作業要求你改寫作業三的client程式,
使用select函數呼叫進行 I/O Multiplexing 作業,以完成通訊要求。
如同作業三的client程式, 此 client 與 server 的連結建立後(port=SERV_PORT+1),先送出你的學號。 Server 收到後,會設定一個1至10的亂數,令為 n。然後 server 會讀取 n 列由 client 端使用者輸入的文字。請注意 server 並不會將此 n 值告訴 client 端。 當讀畢 n 列的資料後,server 會對 client 送出 "stop"。client 收到後要立刻回傳 已傳送至 server 端的文字列數。如果此數目與 server 端的 n 值吻合, server 會回傳 "ok" 並結束,如果不正確 server 會回傳 "nak" 並結束。一個正確的執行流程 範例如下圖所示。 |

假設我們先將作業三的 client 程式 hw3cli.c 複製成為另一個 hw4cli.c。接下來
你可以用 Unix 下的 vi 或 GNOME 桌面下的 gedit 來編輯此程式。
事實上你要做的事有兩件:
|
|
如果編譯沒問題,就可以執行你的這個 client 程式了。目前老師的 server IP 位址為 140.127.220.246。你可以在 client 程式中加適當的 output 訊息以瞭解 連線過程是否順利。如以下的執行範例: lhyen@lhyen-desktop:~/np/unpv13e/select$ ./hw4cli 140.127.220.246 sent: A0945535 this is yet another test maybe this time i will success but who knows everything is possible nothing is impossible network programming is hard recv: stop sent line count 6 recv: ok success! lhyen@lhyen-desktop:~/np/unpv13e/select$server 程式會記錄連線的時間, IP 位址, port號碼等訊息,也會記錄收到的資料。為了瞭解 server 程式的運作,你也可以下載安裝 server 程式以供自行測試之用。 |
|
我將以 server 程式的連線記錄檔來作為程式是否撰寫成功與否的依據。請注意一定要以自行 keyin
資料的方式與 server 通訊,且最好是有意義的文字(不是亂 key 的)。如果 client 用程式內部事先準備好的資料來取代 keyin 資料送給
server,則所需時間甚短,從連線記錄檔即可看出來。另外,
client 程式收到 server 送出 "stop" 的後,要立刻(以程式碼)回傳已傳送至 server 端的文字列數。
如果 client 以自行 keyin 結果的方式送出此資料,則所需時間甚長,從連線記錄檔即可看出來。
提醒各位:在 select/strcliselect01.c 和 select/strcliselect02.c 的範例中,是以 呼叫 Read 函數(而非 Readline) 接收 server 送過去的資料,所以 server 並未在送給 client 的資料最後加上換行字元。這部份與作業三不同。但 server 程式仍以呼叫 Readline 函數接收 client 送過去的資料,所以 client 端仍必須在要送出去資料的最後加上換行字元, server才讀得到。 另外,在 select/strcliselect01.c 和 select/strcliselect02.c 的範例中,從 stdin 與 socket 中讀取資料皆使用 Read 函數與同一個緩衝區 buf。而 Read 函數從 socket 讀資料進來時, 並不會自動在資料最後面加 '\0',讀進來的資料是覆寫在 buf 原有的內容(比如使用者最後從 stdin 鍵入的資料) 上面的。 所以如果要呼叫字串相關函如 strlen, strcmp 對 buf 作運算時, 記得要自行在讀進資料最後面加上 '\0' 才會正確。 |
Maintained by Li-Hsing Yen.