網路程式設計 作業四

Last updated:

此次作業要求你改寫作業三的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 來編輯此程式。 事實上你要做的事有兩件:
  1. 改寫 main 中程式碼,使連結建立的 port 為 SERV_PORT+1。
  2. 參考 select/strcliselect01.c 或 select/strcliselect02.c 改寫 hw4cli.c 中 的 xchg_data 函數 (假設你是依照作業三的建議命名), 使無論 stdin 或 socket 有輸入都可以處理,不必依照一定的順序。這樣你才可以 讓使用者輸入任意列數的資料,而在收到 server 傳來的 "stop" 後停止。
修改完程式後,請參考此網頁來編譯你的程式

如果編譯沒問題,就可以執行你的這個 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.

Please report any mistakes/typos.